我已经阅读了几次SimpleInjector文档。但是有一些问题。
上下文:
问题:
因为我在MVC控制器和API控制器中使用服务;这是否意味着我不能使用RegisterWebApiRequest代替RegisterPerWebRequest?
我的服务,存储库等都没有维护任何状态,我会使用PerWebRequest作为Transient获得相同的功能;在Transient上使用PerWebRequest有什么好处吗?
答案 0 :(得分:2)
请阅读以下问答:How to configure simple injector container and lifestylse in a MVC web app with WebAPI, WCF, SignalR and Background Tasks。答案解释说:
WebRequestLifestyle
。 WebApiRequestLifestyle
是指适用于IIS和自托管环境的Web API的生活方式,但由于您将Web API控制器放在同一个项目中,因此您显然只对IIS托管感兴趣;在这种情况下,WebRequestLifestyle
会很好。因为我在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>