存储库,UnitOfWork和Unity

时间:2011-08-04 08:04:25

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

当我'新建'一个需要依赖的对象时使用Unity,即存储库,UnitOfWork都很好,我的新对象注入了依赖项,'newed'up对象可以控制UnitOfWork,它们也需要存储库使用相同的UnitOfWork(使用PerResolve生命周期管理器)也会注入UnitOfWork依赖项。

一切都很好,但是我遇到问题的是UnitOfWork和存储库的范围是在类级别。

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

非常感谢一些指导。

3 个答案:

答案 0 :(得分: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。

答案 1 :(得分:0)

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

通常的方法是拥有一个IUnitOfWorkFactory或其他类似的东西。从容器中取出 。然后在您的方法中调用工厂以获取您的工作单元对象。工厂可能(或可能不)回到集装箱去做它的工作。

答案 2 :(得分:0)

在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)