【发布时间】:2013-01-20 22:17:16
【问题描述】:
我一直在研究使用 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 的假上下文,这样我就不必让如此截然不同的类实现存储库接口?
总结:我了解使用内存存储库进行测试的优势。我的问题是,当我必须对存储库进行两种不同的实现时,这是否意味着我做错了什么,或者这只是用假货进行测试的成本,如果逻辑测试通过,我应该'汗流浃背?
【问题讨论】:
标签: entity-framework tdd repository-pattern