2014-03-07 17 views

回答

11

的生活方式和范围的实施方式中在2.5 SimpleInjector和WebRequestWebApiRequest是基于不同的技术。

WebApiRequestLifestyle源自ExecutionContextScopeLifestyle,它在IIS内部和外部都能正常工作。即它可以在没有HttpContext.Current的自托管WebAPI项目中运行。 WebApiRequestLifestyle使用的范围是ExecutionContextScope。顾名思义,ExecutionContextScope在逻辑调用上下文中注册自己,并在跨线程的操作中流动(例如,在不同线程上的await仍然可以访问范围,而不管ConfigureAwait()true或一起使用)。

相比之下,WebRequestLifestyle的实例存储在HttpContext内。当它位于IIS中时,HttpContext可与WebAPI一起使用,但必须小心,因为它不总是随执行上下文一起流动,因为当前的HttpContext存储在IllogicalCallContext(请参见Understanding SynchronizationContext in ASP.NET)中。如果您使用awaitConfigureAwait(false),则每当异步操作不同步执行时,延续可能会丢失原始HttpContext的跟踪。这样做的一个直接影响是不再可能使用容器中的WebRequestLifestyle来解析先前创建的服务的实例(例如,在可访问容器的工厂中) - 并且会抛出异常,因为HttpContext.Current会是null

我建议你使用WebApiRequestLifestyle作为“每个Web API请求”的服务,最明显的例子是注入WebAPI控制器的服务。 WebApiRequestLifestyle具有以下优点:

  • 的的WebAPI控制器都可以使用(在自托管项目如)IIS以外
  • 的的WebAPI控制器可以执行自由线程(或多线程async方法,因为它不限于ASP.net SynchronizationContext

查看Stephen Toub有关difference between ExecutionContext and SynchronizationContext的博客文章。

+5

+1。我自己无法更好地描述它。我可能会将您的答案直接复制到Simple Injector wiki。 – Steven

+0

谢谢,这正是我正在寻找的。 – Tris

+1

那些注入MVC​​控制器和WebAPI控制器的服务怎么样?对于我目前使用PerWebRequest的所有服务使用PerWebApiRequest是否安全? – sheamus

相关问题