0

我有一个简单的问题。我更新的是Miscrosoft的UnityContainer。我正在用Unity for DI编写ASP.NET MVC应用程序。 对于连接到我的网络应用程序的每个用户,我有不同的容器吗?或者CONTAINER对所有用户都一样? 所以如果我用ContainerControlledLifetimeManager解决一个对象的生命时间,这是否意味着只有一个用户会话这个对象总是一样的?ASP.NET MVC中的Unity容器

我希望你能理解。

感谢, 基督教

+0

'我正在为DI编写一个ASP.NET MVC应用程序。“ - 请注意Unity项目已经死亡。对于新应用程序,最好使用仍处于活动状态的[许多其他容器]之一(https://github.com/danielpalme/IocPerformance)。 – NightOwl888

+0

真的吗?什么是.net应用程序的最佳选择?我还需要实施贯穿始终的关切。 Autofac? –

回答

1

寿命是指由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实例。工厂为此请求提供当前实例(服务的生命周期中只有两个实例)(每秒数千次)。

这种模式是什么使您最近可能使用的非常大的网站非常稳定和非常灵活。使用这种完全相同的模式推出新版服务,以帮助保持网站的稳定性。

+0

我的意思是,如果我用ContainerControlledLifetimeManager解决连接到数据库的对象,这个对象对于连接到我的wep应用程序的所有客户端都是相同的? –

+0

答案取决于。我认为通常希望共享连接,以便您的数据库性能更好。完全不同的谈话。我不得不更深入地了解我们的代码,但我的建议是尝试不同的注册类型。创建一个具有使用计数的对象,通过多种方式注册它并询问每个事物的使用次数。如果它总是一个,那么你有一个工厂,每个请求创建一个。如果它在每个引用上增加,它就是一个单例。如果使用计数在增加一段时间后出现意外返回到1的错误。 –