【问题标题】:Reason to use PerThreadLifetimemanager vs Transientlifetimemanager使用 PerThreadLifetimemanager 与 Transientlifetimemanager 的原因
【发布时间】:2015-08-13 08:31:09
【问题描述】:

我在构造函数中使用 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 有用?

谢谢!

【问题讨论】:

  • 购物车是特定于用户的,因此在这种情况下使用每个线程的生命周期是没有意义的。但是可能有其他服务不是用户特定的;例如,如果所有用户都可以访问相同的产品,则 IProductService 可以是每个线程的。
  • 谢谢! DBContext 应该是 Per-thread 吗?
  • 可能不会;通常 DBContext 是每个请求的

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


【解决方案1】:

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

Here 就是很好的例子。

如果您不知道自己在做什么,我不建议您使用 PerThreadLifetimeManager。

【讨论】:

  • Приятно видеть своих :) Не совсем понял, что даст HierarchicalLifetimeManager в сравнении с Transientlifetimemanager
  • @ВладимирЛапенковTransientlifetimemanagerдаеттебевсегдановыйинстанс,чтоневерно,вслучаекогдатебе,например,нужноделить的DbContextнавсесервисыврамкаходноговызова(или的UnitOfWork)。 Т.е. тут все сервисы могут быть созданы по-дефолту, а вот UnitOfWork у них должен быть один。 При этом, у разных пользователей (запросов, т.к.у тебя MVC) должен быть разный тот самый UnitOfWork。 Для этого он и регистрируется с HierarchicalLifetimeManager 和 резолвится из дочернего контейнера。 Т.е. изоляция между пользователями происходит на уровне контейнеров.
  • @ВладимирЛапенков вот хорошая ссылка на эту тему msdn.microsoft.com/en-us/library/ff660872(v=pandp.20).aspx
  • HierarchicalLifetimeManager делает единственный сервис в рамках 请求 для каждого контроллера,это мне и нужно。 То есть вызовов конструктора контролера -5 а экземпляр - один。 Я не использую UnitOfWork。 Внедряю сами сервисы в контроллер по образу nopCommerse。 Спасибо за инфу!
  • @ВладимирЛапенков если мой ответ тебе помог, не мог бы ты его отметить?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-08
  • 1970-01-01
  • 1970-01-01
  • 2011-08-19
  • 2011-09-16
  • 2010-12-26
  • 2010-11-18
相关资源
最近更新 更多