C# 使用PerThreadLifetimemanager与Transientlifetimemanager的原因

C# 使用PerThreadLifetimemanager与Transientlifetimemanager的原因,c#,asp.net-mvc-4,dependency-injection,unity-container,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; _productS

我在构造函数中使用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();
}
public-BaseShoppingCart(HttpContextBase上下文、IRepository cart、ipProductService-productservice)
{  
_上下文=上下文;
_购物车=购物车;
_productService=productService;
ShoppingCartId=\u context.Request.IsAuthenticated?\u context.User.Identity.Name:GetSessionPartId();
}
  • 如果我在DI容器(Unity)中设置Transientlifetimemanager(默认情况下),则不会显示任何错误
  • 如果我设置PerThreadLifetimeManager,任何用户都可能获得另一个用户的购物车!正如我从这篇文章中所读到的,线程比请求长,所以第二次调用ShoppingCartController是错误的。在这种情况下,可能不会调用BaseShoppingCart的ctor。而是从容器返回现有的BaseShoppingCart对象(另一个用户的对象)
我需要你的意见:

  • 我正确理解这个问题吗
  • 在哪些情况下PerThreadLifetimemanager比Transientlifetimemanager更有用
  • 谢谢

    要隔离用户(请求),请为每个请求创建新的子容器,并从子容器解析服务。因此,您可以向
    HierarchyCallifeTimeManager
    注册您的服务,您将为每个用户(请求)获得新实例

    这些都是很好的例子


    如果您不知道自己的实际操作,我建议您不要使用PerThreadLifetimeManager。

    购物车是特定于用户的,因此在这种情况下使用每个线程的生命周期是没有意义的。但也可能有其他非特定于用户的服务;例如,如果所有用户都可以访问相同的产品,则IPProductService可以是每个线程。谢谢!DBContext应该是每个线程吗?可能不是;通常,DBContext是根据请求的:临时寿命管理器、临时寿命管理器、,工程单元。Т.е. 单位工程。单元工程。分级时间经理。Т.е. 卡里菲蒂姆经理请求контроллера, это мне и нужно. То есть вызовов конструктора контроллера -5 а экземпляр - один. 工作单元。没有商业化。Спасибо за инфу!@ВладимирЛапенков если мой ответ тебе помог, не мог бы ты его отметить?