【问题标题】:Repositories, UnitOfWork and Unity存储库、UnitOfWork 和 Unity
【发布时间】:2011-08-04 08:04:24
【问题描述】:

当我“新建”一个需要依赖项的对象时使用 Unity,即存储库,UnitOfWork 一切都很好,我的新对象注入了依赖项,并且“新建”对象可以控制 UnitOfWork,因为它们也需要存储库UnitOfWork 依赖项也被注入,具有相同的 UnitOfWork(使用 PerResolve 生命周期管理器)。

一切都很好,但是我有一个问题是这个 UnitOfWork 的范围和存储库处于类级别。

如果我希望在方法级别控制 UnitOfWork 的生命周期,我应该如何处理?我应该使用方法注入吗?如果是这样,我的方法是否应该再次获取所有必需的依赖项,即 Repositories 和 UnitOfWork ??

我们将不胜感激。

【问题讨论】:

  • 据我所知,Unity 不提供 HttpRequest Scoped Lifetime。因此,您可以管理自己的生命周期,也可以不使用 Unity(几乎所有其他容器、Autofac、Ninject、StructureMap,都支持 Http Request Scoped Lifetimes。

标签: c#-4.0 repository unity-container unit-of-work


【解决方案1】:

实际上,根据请求保留工作单元(使用 DbContext 包装)。如果您明智地使用方法,这将是一个昂贵的解决方案。例如,

public void SaveAccount(Account account)
{
    using(var unitOfWork = unitOfFactory.CreateUnitofWork())
    {
       new Repository<Account>(unitOfWork).Attach(account);
       unitOfWork.Commit();           
    }       
}

public Account GetAccount(int id)
{
    using(var unitOfWork = unitOfFactory.CreateUnitofWork())
    {
      return new Repository<Account>(unitOfWork).Get(id);
    }
}

public void MakePayment(int fromAccount, int toAccount, decimal ammount)
{
   var from = Dao.GetAccount(fromAccount);
   var to = Dao.GetAccount(toAccount);
   from.Total -= amount;
   to.Total += amount;
   Dao.SaveAccount(from);
   Dao.SaveAccount(to);
}

我们在一个方法中使用了 4 个不同的数据库连接,也不能安全地使用事务。用户每个请求的基本工作单元可以作为一个容器使用 HttPContext。

【讨论】:

    【解决方案2】:

    您不应该将 DI 用作方法参数,至少不应该直接使用。

    通常的方法是使用 IUnitOfWorkFactory 或类似的方法。将 that 从容器中取出。然后在您的方法中调用工厂以获取您的工作单元对象。工厂可能(也可能不会)回到容器中进行工作。

    【讨论】:

    • 开始沿着这条路线并停止,因为当时我不确定如何为存储库提供工作单元,因为我没有更新存储库(想要使用 DI)并且试图避免任何引用我的统一容器,例如 container.resolve?
    【解决方案3】:

    在 StackOverflow 上搜索似乎建议从此处的 MVC 项目中提取 Http Request Lifetime Manager:

    http://mvcunity.codeplex.com/

    由于 Unity 本身没有自己的 Http Request Lifetime Manager。

    其他问题:

    How to inject dependencies per http request (or per http context) with unity 2.0 and asp.net mvc

    Using ASP.NET Session for Lifetime Management (Unity)

    【讨论】:

      猜你喜欢
      • 2019-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-28
      • 2011-05-24
      • 2013-03-02
      相关资源
      最近更新 更多