into
在阅读了有关如何实现工作单位并保持心灵测试(单位测试)的多篇文章之后,我可以在我阅读的某些内容中看到以下内容:
- 接口:iRepository,iunitofwork。iRepository可以(可能是)像
IRepository<TEntity>
这样的通用。 - iRepository和iunitofwork之间存在一个耦合。在某些示例中,您可以看到Irpository对Iunitofwork的依赖性。您还会看到,混凝土单元中的多个iRepository属性
-
在末尾附近的多个示例中,您可以看到这样的用法示例:
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。我们会手动做类似
uow.Dispose();
的事情。 - 我们(ex:ninject)是否可以依靠DI容器来处理每个Web请求(MVC)的处置?如果是,我们该怎么做(ninject),这是设计pov的有效方法吗?
- 您是否会考虑一个工作单位将访问域中的所有存储库(如果单位工程汇总存储库),因此我们只有一个具体的Iunitofwork实施?
- 使Iunitofwork保持简单,例如仅包含一个save()方法签名,或者它包含iRepository属性,或者也许是一个通用方法签名,例如
IRepository GetRepository<TEntity>();
?
参考
- http://www.asp.net/mvc/tutorials/getting-started-with-ef-5-isus-mvc-4/implementing-the-reposository-the-repository-and-unit--unit--unit-of-work-ports-in-in-AS-ASP-NET-MVC-APPLICATION
- 服务或repo的工作单位
- https://codereview.stackexchange.com/questions/31822/31822/unit-er-work-work--repositority-design-pattern-implementation/3183343343331833?
创建通过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。
顺便说一句,这是值得阅读这些模式的DI书的示例。
编辑:DI书的本章正在谈论一次性对象