Sam*_*Sam 58 c# dependency-injection autofac asp.net-mvc-3
这两个范围有什么区别?
我正在Module每层构建(存储库,服务,MVC应用程序),但为了让InstancePerHttpRequest您需要Autofac.Mvc程序集.
我应该在我的存储库和服务层中使用哪个范围?
ger*_*rod 114
InstancePerHttpRequest并且InstancePerApiRequest基本上做同样的事情 - 你为每个离散的Web请求获得一个服务实例.我将使用InstancePerHttpRequest其余的答案,但请记住,这两个是可以互换的.
InstancePerLifetimeScope表示将为每个请求服务的生命周期范围创建新的服务实例.每个Web请求都有自己的新生命周期范围,因此在实践中,这两个通常会做同样的事情.
唯一真正的区别在于您已经注册了一项服务,InstancePerHttpRequest并且您从另一项注册为服务的服务中请求其中一项服务SingleInstance.在这种情况下:
SingleInstance组件位于根范围内InstancePerHttpRequest组件住在一个叫"AutofacWebRequest"的范围,这是一个孩子的根范围的Autofac不允许从子范围解析 - 实际上,SingleInstance服务无法找到InstancePerHttpRequest服务.
但是,如果在这种情况下您使用过InstancePerLifetimeScope(而不是InstancePerHttpRequest),那么您的服务就可以解决.
我写了一篇相当详尽的文章,其中包含可下载的代码,试图详细解释所有这些 - 请参阅此处.引用文章:
这里常见的一个误解是,在WebAPI应用程序中使用InstancePerLifetimeScope注册组件意味着您的组件位于Web请求的范围内 - 即"Lifetime"指的是"Web请求的生命周期".正如你在这里看到的,这是错误的.
组件的生命周期取决于解析的范围.
由于SingletonResolvable从根作用域解析其标记,因此该标记实例位于根作用域中,而不是Web请求的作用域.我以前说过,但我会再说一遍:这个令牌将一直存在,直到整个应用程序被处理掉(例如,IIS工作进程被回收).从根作用域请求ScopeToken的任何内容都将被赋予对该标记的引用.
希望有所帮助 - 我很欣赏这个问题现在很老了,但它仍然非常相关!
应用程序中唯一能够完全决定对象生命周期的地方就是组合根.
在这种情况下,你有一个冲突-你不应该有机会获得由MVC集成提供扩展方法的通用模块-但你需要有才能访问它的生命周期进行适当的管理.在这种情况下,如果您的模块可以提供合理的默认值InstancePerLifetimeScope,那么这就是我在模块级别所做的事情.然后,让组合根覆盖该行为.在这种情况下,组合根将改变生命周期InstancePerHttpRequest.由于上次注册将覆盖之前的注册,因此您应该处于良好状态.
实际上,我已经放弃了创建与包含给定图层的程序集共存的模块,原因如下:
相反(并且在大到足以保证的项目中),我在组合根级别创建模块,因为在这个级别我有关于如何将它们连接在一起的明确知识.有时我会创建一个Ioc包含的模块和作为默认的组成根组件-但这往往是在"真正的"组成根覆盖(例如,在拉动控制台或MVC应用程序Ioc组件).