适用于WebApi和UnitOfWork Pattern的SimpleInjector配置

时间:2015-10-07 16:55:32

标签: asp.net-mvc entity-framework asp.net-web-api inversion-of-control simple-injector

我已经阅读了几次SimpleInjector文档。但是有一些问题。

上下文:

  • 3层应用程序(演示文稿(mvc + api控制器),服务(业务逻辑),数据(存储库,实体等)
  • 工作单位是围绕EF的DbContext
  • 的薄包装
  • 我的DbContext和工作单元已注册 PerWebRequest ,正在使用 RegisterWebApiRequest导致异常,因为使用了工作单元 Web API请求之外。
  • 我的MVC和Api控制器使用 RegisterWebApiControllers(GlobalConfiguration.Configuration) RegisterMvcControllers(Assembly.GetExecutingAssembly())
  • 注册
  • 每个控制器都注入一个或多个服务。
  • 每个服务都有一个或多个存储库注入其中。
  • 服务也可以注入其他服务。
  • 我希望所有服务/存储库中都存在相同的工作单元/ DbContext。

问题

  • 因为我在MVC控制器和API控制器中使用服务;这是否意味着我不能使用RegisterWebApiRequest代替RegisterPerWebRequest?

  • 我的服务,存储库等都没有维护任何状态,我会使用PerWebRequest作为Transient获得相同的功能;在Transient上使用PerWebRequest有什么好处吗?

1 个答案:

答案 0 :(得分:2)

请阅读以下问答: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是指适用于IIS和自托管环境的Web API的生活方式,但由于您将Web API控制器放在同一个项目中,因此您显然只对IIS托管感兴趣;在这种情况下,WebRequestLifestyle会很好。
  3.   

    因为我在MVC控制器和API控制器中使用服务;这是否意味着我不能使用RegisterWebApiRequest代替RegisterPerWebRequest?

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

    正如在解析Web API控制器时可以使用WebRequestLifestyle一样,您也可以将WebApiRequestLifestyle(或基础ExecutionContextScopeLifestyle)用于MVC控制器。但是如果你想要这个,你将为MVC创建自己的IDependencyResolver实现,它将明确地开始和结束ExecutionContextScope。存储在Scope中的CallContext的缺失是使用WebApiRequestLifestyle注册服务时解决MVC控制器失败的原因。但是虽然可以在MVC中使用WebApiRequestLifestyle,但是相反更容易,因为不需要自定义代码。

      

    我的服务,存储库等都没有维护任何状态,我会使用PerWebRequest作为Transient获得相同的功能;在Transient上使用PerWebRequest是否有任何优势?

    如果服务没有州,那么他们的生活方式无关紧要。唯一的限制是他们的依赖关系的生活方式等于或长于他们自己的生活方式。违反此限制的行为称为Captive Dependencies,可能会造成各种麻烦。由于强制依赖性很差,Simple Injector v3会检查并阻止这种情况。

    尽管您可以在配置范围内使所有对象作为范围(非瞬态),但使它们成为瞬态通常更容易配置,并且可能会带来更好的性能(尽管您可能永远不会注意到现实生活中的差异)。 / p>