SimpleInjector的最新版本引入了MVC和WebApi之间的区别。这两个请求注册是否为同一个事件别名?或者是否存在根本差异?SimpleInjector RegisterWebApiRequest vs RegisterPerWebRequest
由于
SimpleInjector的最新版本引入了MVC和WebApi之间的区别。这两个请求注册是否为同一个事件别名?或者是否存在根本差异?SimpleInjector RegisterWebApiRequest vs RegisterPerWebRequest
由于
的生活方式和范围的实施方式中在2.5 SimpleInjector和WebRequest
WebApiRequest
是基于不同的技术。
WebApiRequestLifestyle
源自ExecutionContextScopeLifestyle
,它在IIS内部和外部都能正常工作。即它可以在没有HttpContext.Current
的自托管WebAPI项目中运行。 WebApiRequestLifestyle
使用的范围是ExecutionContextScope
。顾名思义,ExecutionContextScope
在逻辑调用上下文中注册自己,并在跨线程的操作中流动(例如,在不同线程上的await
仍然可以访问范围,而不管ConfigureAwait()
与true
或一起使用)。
相比之下,WebRequestLifestyle
的实例存储在HttpContext
内。当它位于IIS中时,HttpContext
可与WebAPI一起使用,但必须小心,因为它不总是随执行上下文一起流动,因为当前的HttpContext
存储在IllogicalCallContext
(请参见Understanding SynchronizationContext in ASP.NET)中。如果您使用await
和ConfigureAwait(false)
,则每当异步操作不同步执行时,延续可能会丢失原始HttpContext
的跟踪。这样做的一个直接影响是不再可能使用容器中的WebRequestLifestyle
来解析先前创建的服务的实例(例如,在可访问容器的工厂中) - 并且会抛出异常,因为HttpContext.Current
会是null
。
我建议你使用WebApiRequestLifestyle
作为“每个Web API请求”的服务,最明显的例子是注入WebAPI控制器的服务。 WebApiRequestLifestyle
具有以下优点:
async
方法,因为它不限于ASP.net SynchronizationContext
。查看Stephen Toub有关difference between ExecutionContext
and SynchronizationContext
的博客文章。
+1。我自己无法更好地描述它。我可能会将您的答案直接复制到Simple Injector wiki。 – Steven
谢谢,这正是我正在寻找的。 – Tris
那些注入MVC控制器和WebAPI控制器的服务怎么样?对于我目前使用PerWebRequest的所有服务使用PerWebApiRequest是否安全? – sheamus