【发布时间】:2014-01-25 14:33:29
【问题描述】:
简介
在阅读了多篇关于如何实现工作单元并牢记可测试性(单元测试)的文章后,我可以在阅读的一些内容中看到以下内容:
- 接口:IRepository、IUnitOfWork。 IRepository 可以(可能是)像
IRepository<TEntity>这样的泛型。 - IRepository 和 IUnitOfWork 之间存在耦合。在某些示例中,您可以在 IRepository 中看到 IUnitOfWork 的依赖关系。您还会看到,一个具体的 UnitOfWork 中有多个 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(); }
问题/意见
- 这样的用法可以测试吗?它显然依赖于 UnitOfWork 的具体实现。
- 我们的单元测试是否预计不会涵盖此类示例?
- 如果要对其进行测试,那么代码将如何更改?我们是否会像
ctor(IUnitOfWork uow){this.uow = uow;}这样在构造函数中注入工作单元,然后像这样使用它:this.uow.Save();? - 如果我们走那条路,那么我们就不能利用 using 语句和 uow 的自动处理。我们将手动执行
uow.Dispose();之类的操作。 - 我们能否(例如:Ninject)依赖 DI 容器来为我们处理每个 Web 请求 (MVC) 的处置?如果是,我们如何做到这一点(Ninject),它是否是设计 POV 的一种有效方法?
- 您是否认为工作单元可以访问域中的所有存储库(如果 UnitOfWork 公开存储库),因此我们只有一个 IUnitOfWork 的具体实现?
- 是让 IUnitOfWork 保持简单,只包含一个 Save() 方法签名,还是让它包含 IRepository 属性,或者可能是一个通用方法签名,如
IRepository GetRepository<TEntity>();?
参考文献
- http://www.asp.net/mvc/tutorials/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application
- Decouple unit of work from services or repo
- https://codereview.stackexchange.com/questions/31822/unit-of-work-and-repository-design-pattern-implementation/31833#31833?newreg=c38ed8eac7b549728ae8f82b965fff09
【问题讨论】:
-
我会使用
IRepository.Save<T>而不是IRepository<T>.Save()。在您访问多个实体的情况下,为您省去创建多个存储库的麻烦。
标签: asp.net-mvc unit-testing ninject unit-of-work