WebApi 和 UnitOfWork 模式的正确 SimpleInjector 配置

Proper SimpleInjector configuration for WebApi and UnitOfWork Pattern

我已经通读了几遍 SimpleInjector 文档。但是有几个问题。

上下文:

问题:

请阅读以下q/a:How to configure simple injector container and lifestylse in a MVC web app with WebAPI, WCF, SignalR and Background Tasks。答案解释说:

  1. 将 Web API 与 MVC 控制器放在同一个项目中,从架构的角度来看是个坏主意。
  2. 但是如果你想这样做,你可以在这两种类型的应用程序中使用 WebRequestLifestyleWebApiRequestLifestyle 意味着适用于 Web API 的生活方式,适用于 IIS 和自托管环境,但由于您将 Web API 控制器放在同一个项目中,您显然只感兴趣在 IIS 托管中;在这种情况下,WebRequestLifestyle 就可以了。

Because I am using services in my MVC controllers as well as API controllers; does that mean I can not use RegisterWebApiRequest in place of RegisterPerWebRequest?

两种生活方式都使用不同的缓存方式。 WebRequestLifestyle 使用 HttpContext.Current.Items 字典存储其 SimpleInjector.Scope 实例,而 WebApiRequestLifestyle 使用 CallContext class 存储 Scope 在单个异步操作的生命周期内。

正如在解析 Web API 控制器时可以使用 WebRequestLifestyle 一样,您也可以将 WebApiRequestLifestyle(或底层的 ExecutionContextScopeLifestyle)用于 MVC 控制器.但是如果你想要这个,你将为 MVC 创建你自己的 IDependencyResolver 实现,它将显式地开始和结束 ExecutionContextScopeCallContext 中缺少 Scope 是使用 WebApiRequestLifestyle 注册服务时解析 MVC 控制器失败的原因。但是,虽然可以在 MVC 中使用 WebApiRequestLifestyle,但反过来要容易得多,因为不需要自定义代码。

none of my services, repositories, etc, maintain any state, I would get the same functionality using PerWebRequest as Transient; is there any advantage to using PerWebRequest over Transient?

如果服务没有状态,那么它们有什么样的生活方式都没有关系。唯一的限制是他们的依赖关系的生活方式与他们自己的生活方式相同或更长。违反此限制称为 Captive Dependencies 并可能导致各种麻烦。因为俘虏依赖性不好,Simple Injector v3 会为您检查并防止这种情况发生。

虽然您可以使配置中的所有对象都具有作用域(非瞬态),但使它们成为瞬态通常更容易配置,并且可能会带来更好的性能(尽管您可能永远不会注意到现实生活中的差异) .