似乎我找到的存储库模式的每个示例,其实现都在某种程度上有所不同。下面是我主要找到的两个例子。
interface IProductRepository
{
IQueryable<Product> FindAll();
}
通常还有另一层与存储库通信并调用 FindAll() 方法并执行任何操作,例如查找以字母 's' 开头的产品或获取特定类别中的产品。
我发现很多的另一个例子将所有的 find 方法放入存储库中
interface IProductRepository
{
IEnumerable<Product> GetProductsInCategory(int categoryId);
IEnumerable<Product> GetProductsStartingWith(string letter);
IEnumerable<PromoCode> GetProductPromoCodes(int productId);
}
您建议我走哪条路?或者说它们之间有什么优点/缺点?
据我阅读后的理解http://martinfowler.com/eaaCatalog/repository.html http://martinfowler.com/eaaCatalog/repository.html第一种方法似乎最能反映这一点?
第一个是可怕的。IQueryable
就像一个上帝对象 http://en.wikipedia.org/wiki/God_object。确实很难找到 100% 完整的实现(即使在所有 OR/M 中)。你可以直接公开你的 ORM 而不是使用它,因为你可能会得到一个抽象层泄漏 http://en.wikipedia.org/wiki/Leaky_abstraction否则。
乔尔说得最好(文字来自维基百科文章 http://en.wikipedia.org/wiki/Leaky_abstraction):
在 Spolsky 的文章中,他提请注意许多在大多数情况下都有效的抽象示例,但其中底层复杂性的细节不容忽视,从而将复杂性推入了本应通过抽象本身来简化的软件中
乔尔斯博客条目 http://www.joelonsoftware.com/articles/LeakyAbstractions.html
第二种方法更容易实现并保持抽象完整。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)