当我'新建'一个需要依赖的对象时使用Unity,即存储库,UnitOfWork都很好,我的新对象注入了依赖项,'newed'up对象可以控制UnitOfWork,它们也需要存储库使用相同的UnitOfWork(使用PerResolve生命周期管理器)也会注入UnitOfWork依赖项。
一切都很好,但是我遇到问题的是UnitOfWork和存储库的范围是在类级别。
如果我希望在方法级别控制UnitOfWork的生命周期,我应该如何处理?我应该使用方法注射吗?如果是这样,我的方法应该采取所有必需的依赖,即Repositories和UnitOfWork再次??
非常感谢一些指导。
答案 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:
由于Unity本身没有自己的Http Request Lifetime Manager。
其他问题:
How to inject dependencies per http request (or per http context) with unity 2.0 and asp.net mvc