当我们用在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的。

Controller的生命周期是Transient还是PerWebRequest?相关推荐

  1. iOS7应用开发5、视图控制器View Controller及其生命周期

    1.UITextView: 该类与Label类类似,可显示多行,可以编辑内容,可以滚动查看内容: 包含属性NSTextStorage *textStorage,该类是NSMutableAttribut ...

  2. SAP UI5 视图控制器 View Controller 的生命周期方法 - Lifecycle methods

    SAPUI5 View Controller lifecycle methods Create an Application Project for SAPUI5 打开 Eclipse 并转到菜单选项 ...

  3. WatchOS系统开发大全(4)-WatchApp生命周期

    WatchOSAPP生命周期 1.1-简介 WatchOS2.0之后的工程与WatchOS1.0的工程有什么不同之处? 创建的方式不同 2.0的工程多了一个文件:ExtensionDelegate 0 ...

  4. ViewController的生命周期分析和使用

    iOS的SDK中提供很多原生ViewController,大大提高了我们的开发效率,下面是我的一些经验. 一.结构 按结构可以对iOS的所有ViewController分成两类: 1.主要用于展示内容 ...

  5. viewController的生命周期

    一.结构 按结构可以对iOS的所有ViewController分成两类: 1.主要用于展示内容的ViewController,这种ViewController主要用于为用户展示内容,并与用户交互,如U ...

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

    1. 对象状态及生命周期 瞬时状态[transient]:对象在内存中存在,在session和数据库中不存在: 持久状态[persistent]:对象在数据库,session中都存在: 游离状态[de ...

  7. PowerEdge服务器生命周期控制器:Lifecycle Controller

    戴尔从第11代服务器开始推出生命周期控制器(简称LC,即Lifecycle Controller).生命周期控制器(LC)通过在主板上部署的控制芯片和闪存,与BMC以及iDRAC卡配合,在服务器的整个 ...

  8. [译] ASP.NET 生命周期 – ASP.NET 上下文对象(六)

    使用 HttpApplication 对象 ASP.NET 框架中的许多类都提供了许多很方便的属性可以直接映射到 HttpContext 类中定义的属性.这种交叠有一个很好的例子就是 HttpAppl ...

  9. flutter中的生命周期

    前言 和其他的视图框架比如android的Activity一样,flutter中的视图Widget也存在生命周期,生命周期的回调函数提现在了State上面.理解flutter的生命周期,对我们写出一个 ...

  10. Elasticsearch索引生命周期管理方案

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 一.前言 在 Elasticsearch 的日常中,有很多 ...

最新文章

  1. python严格的命名冲突
  2. GDCM:gdcm::Base64的测试程序
  3. webpack初体验
  4. 文件操作-读取文件后文件指针会发生变化
  5. 那些零碎的感悟,那些成长的事【壹】
  6. java 视频监控 分屏ui_视频监控网页ActiveX视频分屏播放控件开发
  7. 《三毛。。。。》烂漫
  8. 幼儿园计算机教师论文,幼儿园中班教师论文
  9. 从生产故障解锁RocketMQ集群部署的最佳实践
  10. 面向开发者的最佳 Android 库列表
  11. 先进软件开发技术与工具
  12. ssh 远程连接、上传下载命令
  13. shred如果说它Linux系统是文件粉碎机它就更有名了
  14. python开发指法练习软件_利用“金山打字通”或其它指法训练软件,学习和掌握键盘指法指法输入规则。如果你的电脑中未安装,请到网上下载并自行安装,这里是“金山打字通2016”。...
  15. 360周鸿祎:互联网好产品六字法则——刚需、痛点、高频
  16. After Effects快捷键
  17. 微生物群落结构差异分析
  18. 浏览器无法上网,其他软件可以
  19. Windows Internet Information Services(IIS) 与 inetpub 文件夹
  20. Laravel的env和config傻傻分不清?

热门文章

  1. 《无码的青春》第七章 御姐
  2. 在 MAC下安装 Exuberant ctags
  3. 133 MySQL视图、事务、索引(都很重要)
  4. Java开发笔记(一百四十六)JDBC的应用原理
  5. 用 SQL 脚本读取Excel 中的sheet数量及名称
  6. 876. Middle of the Linked List
  7. 只要是[运算] 就会提升数据类型
  8. IE、Firefox和 Chrome长时间打开后内存都会变很大。
  9. c语言统计字符个数回车字符,C语言统计一串字符中空格键、Tab键、回车键、字母、数字及其他字符的个数(Ctrl+Z终止输入)...
  10. 猴子数据分享微信域名防封技术