SimpleInjector RegisterWebApiRequest vs RegisterPerWebRequest

时间:2014-03-07 05:27:48

标签: asp.net-web-api dependency-injection simple-injector

最新版本的SimpleInjector引入了MVC和WebApi之间的区别。两个请求注册是否为同一个东西的别名?或者是否存在潜在的差异?

由于

1 个答案:

答案 0 :(得分:11)

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

WebApiRequestLifestyle 源自ExecutionContextScopeLifestyle,适用于IIS内部和外部。即它可以在没有HttpContext.Current的自托管WebAPI项目中运行。 WebApiRequestLifestyle使用的范围是ExecutionContextScope。顾名思义,ExecutionContextScope在逻辑调用上下文中注册自身,并在线程之间进行async操作(例如,在await之后的另一个线程上的延续仍然可以访问范围而不管是否ConfigureAwait()truefalse一起使用。

相反, WebRequestLifestyle 的实例存储在HttpContext中。 HttpContext在IIS中托管时可以与WebAPI一起使用,但必须小心,因为它不会始终与执行上下文一起流动,因为当前HttpContext存储在 {{1}中} (参见Understanding SynchronizationContext in ASP.NET)。如果您将IllogicalCallContextawait一起使用,则只要async-op不同步执行,延续就可能会失去对原始ConfigureAwait(false)的跟踪。这样做的直接影响是,不再可能从容器中解析先前创建的具有HttpContext的服务的实例(例如,在有权访问容器的工厂中) - 并且会抛出异常因为WebRequestLifestyleHttpContext.Current

我建议您将null用于“按Web API请求”的服务,最明显的例子是注入WebAPI控制器的服务。 WebApiRequestLifestyle具有以下优势:

  • WebAPI控制器可以在IIS之外使用(例如在自托管项目中)
  • WebAPI控制器可以执行自由线程(或多线程WebApiRequestLifestyle方法,因为它不仅限于ASP.net {{1 }}。

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