使用PerThreadLifetimemanager与Transientlifetimemanager

时间:2015-08-13 08:31:10

标签: c# asp.net-mvc-4 dependency-injection unity-container

我在构造函数中使用DI。 BaseShoppingCart是我设置ShoppingCartId(用于购物车项目)的服务。 这是构造函数:

public BaseShoppingCart( HttpContextBase context, IRepository<TCart> cart  ,IProductService productservice)
{  
    _context = context;
    _cart = cart;
     _productService = productservice;
    ShoppingCartId = _context.Request.IsAuthenticated ? _context.User.Identity.Name : getSessionCartId();
}
  • 如果我在DI容器(Unity)中设置了Transientlifetimemanager(默认情况下),则不会显示任何错误。
  • 如果我设置了PerThreadLifetimeManager,任何用户都可以获得另一个用户的购物车!正如我从这篇文章Why is PerThreadLifetimeManager used in this example?中读到的那样 - 线程比请求更长,所以第二次调用ShoppingCartController是这种情况下可能不会调用BaseShoppingCart的ctor。而是从容器返回现有的BaseShoppingCart对象(另一个用户的对象)。

我需要你的意见:

  1. 我是否理解这个问题?
  2. 在哪些情况下,PerThreadLifetimemanager对Transientlifetimemanager有用吗?
  3. 谢谢!

1 个答案:

答案 0 :(得分:1)

隔离用户(请求)为每个请求创建新的子容器并解析来自子级的服务。因此,您可以使用HierarchicalLifetimeManager注册您的服务,并为每个用户(请求)获取新实例。

Here就是很好的例子。

如果你不知道,你实际上做了什么,我不建议使用PerThreadLifetimeManager。