最新版本的SimpleInjector引入了MVC和WebApi之间的区别。两个请求注册是否为同一个东西的别名?或者是否存在潜在的差异?
由于
答案 0 :(得分:11)
SimpleInjector 2.5中的生活方式和范围实现WebRequest
和WebApiRequest
基于不同的技术。
WebApiRequestLifestyle
源自ExecutionContextScopeLifestyle
,适用于IIS内部和外部。即它可以在没有HttpContext.Current
的自托管WebAPI项目中运行。 WebApiRequestLifestyle
使用的范围是ExecutionContextScope
。顾名思义,ExecutionContextScope
在逻辑调用上下文中注册自身,并在线程之间进行async
操作(例如,在await
之后的另一个线程上的延续仍然可以访问范围而不管是否ConfigureAwait()
与true
或false
一起使用。
相反, WebRequestLifestyle
的实例存储在HttpContext
中。 HttpContext
在IIS中托管时可以与WebAPI一起使用,但必须小心,因为它不会始终与执行上下文一起流动,因为当前HttpContext
存储在 {{1}中} (参见Understanding SynchronizationContext in ASP.NET)。如果您将IllogicalCallContext
与await
一起使用,则只要async-op不同步执行,延续就可能会失去对原始ConfigureAwait(false)
的跟踪。这样做的直接影响是,不再可能从容器中解析先前创建的具有HttpContext
的服务的实例(例如,在有权访问容器的工厂中) - 并且会抛出异常因为WebRequestLifestyle
是HttpContext.Current
。
我建议您将null
用于“按Web API请求”的服务,最明显的例子是注入WebAPI控制器的服务。 WebApiRequestLifestyle
具有以下优势:
WebApiRequestLifestyle
方法,因为它不仅限于ASP.net {{1 }}。查看Stephen Toub关于difference between ExecutionContext
and SynchronizationContext
的博客文章。