我一直在研究使用 EF 实现存储库模式的各种方法,特别是使用通用存储库。
我一直在尝试使用具有 IContext 属性的 IRepository,因此 IRepository 的任何实现之间的唯一区别就是上下文。我发现这很困难,以至于我放弃了“假上下文”方法,现在只在假存储库中有一个 List 字典作为我的“上下文”:
public Dictionary<Type, object> _sets = new Dictionary<Type, object>();
为了操纵它,会在假的时候做这样的事情:
public void Add<T>(T entity) where T : class
{
var set = _sets[typeof (T)] as IQueryable<T>;
var updatedSet = set.ToList();
updatedSet.Add(entity);
_sets[typeof (T)] = updatedSet.AsQueryable<T>();
}
在真正的存储库中,我可以使用:
void Add<T>(T entity)
{
Set<T>().Add(entity);
}
在我的 Update 方法中,我必须有类似的不同实现来容纳继承 DbContext 的真实上下文,以及使用基于集合的方法的假。
这种方法让我很紧张。正如其他人在其他问题中提到的那样,现在我的存储库实现是如此不同,以至于我觉得我不能信任一个测试,直到它使用假的和真实的存储库运行。
我只是一个想太多的菜鸟吗?或者有没有更好的方法来实现一个更像 DbContext 的假上下文,所以我不必让如此截然不同的类实现存储库接口?
总结一下:我了解使用内存存储库进行测试的优势。我的问题是,当我必须对存储库进行两种不同的实现时,这是否意味着我做错了什么,或者这只是用假货进行测试的成本,如果逻辑测试通过,我应该'汗流这么多?