Controller的生命周期是Transient还是PerWebRequest?

当我们用在MVC总使用IoC时,大家的Controller生命周期(lifestyle)是以哪种方式注册的呢?

之前我一直没有思考过这个问题。众所周知在MVC开发过程中,大部分的组件都是以PerWebRequest的方式注册到容器的,Controller也不例外,以Castle为例,注册Controller的代码大都如下:

public class ControllerInstaller:IWindsorInstaller
    {
        public void Install(IWindsorContainer container, IConfigurationStore store)
        {
            container.Register(
                Classes.FromThisAssembly().BasedOn<Controller>().WithService.Self().LifestylePerWebRequest());
        }
    }

经过长期项目运行证明,这样的方式并不会带来任何问题,这样的代码跑的很好。

后来在做webApi开发的时候,又以PerWebRequest的方式注册了webApi的controller。 由于项目需要,我们在MVC的controller中以in-memory的方式调用了webApi的controller, 代码会报出以下异常:Cannot reuse an ‘HomeController‘ instance. ‘HomeController‘ has to be constructed per incoming message. Check your custom ‘IHttpControllerActivator‘ and make sure that it will not manufacture the same instance.

具体解释见ASP.NET Web API中的Controller

很明显,webApi希望每一次请求都创建一个新的controller, 而我们在MVC中的in-memory调用是在同一个webrequest中请求了相同的controller,我们意识到webApi的lifestyle方式选择有问题,在更换为LifestyleTransient后问题顺利解决。

那么Controller的lifestyle究竟是PerWebRequest呢还是Transient呢?我在stackoverfllow发现了这样的解释:

MVC controllers are transient. Thinking about it, this makes sense for a few reasons. First, if a single instance is used to service multiple requests and if multiple requests happen to hit the same controller at the same time, you‘re going to experience some fairly bizarre race conditions. Second, HTTP is by its very nature stateless, and requests exist independently of one another. This is reflected in the transient lifestyle of controllers.

意思是说:controller是transient,首先第一点正好证实了我们项目中遇到的问题,第二,http是无状态的,每一个请求都是相互独立的,这也正好符合transient的定义。

综上分析,mvc或者webapi中controller都应该是transient的。

时间: 2024-11-10 23:27:06

Controller的生命周期是Transient还是PerWebRequest?的相关文章

View Controller 生命周期的各个方法的用法

loadView; This is where subclasses should create their custom view hierarchy if they aren't using a nib. Should never be called directly.这是当他们没有正在使用nib视图页面,子类将会创建自己的自定义视图层.绝不能直接调用. - (void)awakeFromNib; 这个方法用的时候,outlet还没有连接起来,是view Controller刚从storyb

View&#160;Controller&#160;生命周期的各个方法的用法

View Controller 生命周期的各个方法的用法 (2012-07-14 15:09:07) 转载 ▼ 分类: ios 正文开始 - (void)awakeFromNib; 这个方法用的时候,outlet还没有连接起来,是view Controller刚从storyboard建的时候,没有完全建好,不过可能有一些事情要在这个方法里面完成,比如splitViewDelegate,需要在非常早期完成. - (void)viewDidLoad; 用这个的时候,ViewController已经完

【5.0】对象生命周期及crud操作

1. 对象状态及生命周期 瞬时状态[transient]:对象在内存中存在,在session和数据库中不存在: 持久状态[persistent]:对象在数据库,session中都存在: 游离状态[detached]:对象在内存中存在,在session中不存在. 2.  new[瞬时]->save[持久]->close[游离]->update[持久] 3.  get/load(持久) -> delete(瞬时);     get/load(持久) -> colse(游离) 工具

iOS view和viewController的生命周期

转自:http://blog.sina.com.cn/s/blog_801997310101a39w.html 一.ViewController的职责 对内管理与之关联的View,对外跟其他ViewController通信和协调.对于与之关联的View,ViewController总是在需要的时候才加载视图,并在不需要的时候卸载视图,所以也同时担当了管理应用资源的责任 二.ViewController的生命周期 View是指Controller的View.它作为Controler的属性,生命周期

iOS-ViewController的生命周期

iOS SDK中提供很多原生的ViewController,大大提高了我们的开发效率:那么下面我们就根据开发中我们常用的ViewController谈一谈它的生命周期: (一)按照结构和用法可以对iOS的所有ViewController分成两类: 1.主要用于展示内容的ViewController:如UITableViewController,UIViewController,这种ViewController主要为用户展示应用的内容,并提供与用户交互. 2.用于控制和显示其他ViewContro

ViewController的生命周期分析和使用

ViewController的生命周期分析和使用 一.结构 按结构可以对iOS的所有ViewController分成两类: 1.主要用于展示内容的ViewController,这种ViewController主要用于为用户展示内容,并与用户交互,如UITableViewController,UIViewController. 2.用于控制和显示其他ViewController的ViewController.这种ViewController一般都是一个ViewController的容器.如UINa

[zhang] ViewController的生命周期分析和使用

iOS的SDK中提供很多原生ViewController,大大提高了我们的开发效率,下面是我的一些经验. 一.结构 按结构可以对iOS的所有ViewController分成两类:1.主要用于展示内容的ViewController,这种ViewController主要用于为用户展示内容,并与用户交互,如UITableViewController,UIViewController.2.用于控制和显示其他ViewController的ViewController.这种ViewController一般都

View和viewController的生命周期

一.ViewController的职责 对内管理与之关联的View,对外跟其他ViewController通信和协调.对于与之关联的View,ViewController总是在需要的时候才加载视图,并在不需要的时候卸载视图,所以也同时担当了管理应用资源的责任 二.ViewController的生命周期 View是指Controller的View.它作为Controler的属性,生命周期在Controller的生命周期内.就是说你的Controller不能在view释放前就释放了. viewCon

(3)Asp.Net Core 服务生命周期

1.前言 在ConfigureServices方法中的容器注册每个应用程序的服务,Asp.Core都可以为每个应用程序提供三种服务生命周期:●Transient(暂时):每次请求都会创建一个新的实例.这种生命周期最适合轻量级,无状态服务.●Scoped(作用域):在同一个作用域内只初始化一个实例 ,可以理解为每一个请求只创建一个实例,同一个请求会在一个作用域内.●Singleton(单例):整个应用程序生命周期以内只创建一个实例,后续每个请求都使用相同的实例.如果应用程序需要单例行为,建议让服务