在阅读了多篇关于如何实现工作单元并牢记可测性(单元测试)的文章之后,我可以在以下部分内容中看到以下内容:
IRepository<TEntity>
的通用。在接近结尾的多个示例中,您可以看到如下用法示例:
using(var uow = new UnitOfWork()) {
//some work here, maybe accessing member repositories in uow like:
//var item = uow.Repository1.GetById(1);
//item.SomeModifyingOperation();
uow.Save();
}
ctor(IUnitOfWork uow){this.uow = uow;}
之类的构造函数中注入工作单元,然后像这样使用它:this.uow.Save();
?uow.Dispose();
。IRepository GetRepository<TEntity>();
这样的通用方法签名更好?答案 0 :(得分:3)
创建一个通过DI注入的IUnitOfWorkFactory:
public interface IUnitOfWorkFactory
{
IUnitOfWork Create();
}
public class UnitOfWorkFactory : IUnitOfWorkFactory
{
public IUnitOfWork Create()
{
return new UnitOfWork();
}
}
然后在您的消费者中注入UnitOfWorkFactory:
public MyController(IUnitOfWorkFactory workFactory)
{
this.workFactory = workFactory;
}
public ActionResult DoSomething()
{
using(var uow = workFactory.Create())
{
//do work
}
}
通过这种方式,您可以从两个世界中获得最佳效果。你注入了你的对象 - 有助于测试。并且您可以在需要时自动处理您的UOW。
顺便说一句,这是the DI book值得一读的这些模式的例子。
编辑:This chapter from DI book正在谈论一次性对象