使用 PerThreadLifetimemanager 与 Transientlifetimemanager 的原因
Reason to use PerThreadLifetimemanager vs Transientlifetimemanager
我在构造函数中使用 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 的构造函数。而是从容器返回现有的 BaseShoppingCart 对象(另一个用户的对象)。
我需要你的意见:
- 我对这个问题的理解正确吗?
- PerThreadLifetimemanager 在哪些情况下比 Transientlifetimemanager 更有用?
谢谢!
要隔离用户(请求),请为每个请求创建新的子容器并从子容器中解析服务。因此,您可以使用 HierarchicalLifetimeManager
注册您的服务,您将为每个用户(请求)获得新实例。
Here 是很好的例子。
如果您不知道自己实际做什么,我不建议您使用 PerThreadLifetimeManager。
我在构造函数中使用 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 的构造函数。而是从容器返回现有的 BaseShoppingCart 对象(另一个用户的对象)。
我需要你的意见:
- 我对这个问题的理解正确吗?
- PerThreadLifetimemanager 在哪些情况下比 Transientlifetimemanager 更有用?
谢谢!
要隔离用户(请求),请为每个请求创建新的子容器并从子容器中解析服务。因此,您可以使用 HierarchicalLifetimeManager
注册您的服务,您将为每个用户(请求)获得新实例。
Here 是很好的例子。
如果您不知道自己实际做什么,我不建议您使用 PerThreadLifetimeManager。