我有一个简单的问题。我是Miscrosoft的UnityContainer的新手。我正在使用Unity for DI编写ASP.NET MVC应用程序。 我是否为连接到我的网络应用程序的每个用户提供了不同的CONTAINER?或者CONTAINER对所有用户都一样? 因此,如果我使用ContainerControlledLifetimeManager解决对象的生命周期,是否意味着仅对于一个用户会话,此对象始终是相同的?
我希望你明白。
谢谢, 基督教
答案 0 :(得分:2)
生命周期是指DI过程创建的对象的生命周期。每个请求意味着每个请求都有自己的对象。如果对象依赖于当前用户,该请求的查询字符串值或请求标头的值/存在,则PerRequest生存期是合适的。如果您的设置根据服务的位置而有所不同,例如,您从web.config中保存了值,那么容器很可能是在global.asa中创建的,只要容器存在,这些对象就可以存在。
一个具体的例子:
您有一项服务作为您网站的一部分,并且您正在迁移到该服务的vNext。用户可以通过单击包含&myService=vNext
等参数的链接来选择加入,以查看新行为。 Factory方法使用此参数的值为每个请求选择vNow或vNext。
这里有一些伪代码可以帮助您入门:
container.RegisterInstance<IProductFactory>("enterprise", new EnterpriseProductFactory());
container.RegisterInstance<IProductFactory>("retail", new RetailProductFactory());
container.RegisterVersionedServiceFactory<IProductFactorySettings, IProductFactory>();
在此示例中,RegisterVersionedServiceFactory是一种扩展方法,除了决定将哪个IProductFactory实例用于当前请求之外什么都不做。工厂提供当前实例(服务的生命周期中只有两个)用于此请求(每秒数千个)。
这种模式使您最近可能使用的非常大的网站非常稳定且非常灵活。使用这种完全相同的模式推出新版本的服务,以帮助保持网站非常稳定。