RepositoryPatternImplementation好像我找到的每一个repositorypattern的例子,实现在某些方面都不一样。这是我发现的两个主要例子。接口IProductRepository{IQueryableFindAll();然后通常还有另一层与存储库通信并调用FindAll()方法并执行所需的任何操作,例如查找以字母“s”开头的产品或获取特定类别的产品。另一个我发现很多的例子将所有的查找方法放在存储库接口IProductRepository{IEnumerableGetProductsInCategory(intcategoryId);IEnumerableGetProductsStartingWith(字符串字母);IEnumerableGetProductPromoCodes(intproductId);你建议我走哪条路?或者彼此的优点/缺点是什么?据我了解,阅读http://martinfowler.com/eaaCatalog/repository.html第一种方法似乎最能反映这一点?第一个是可怕的。IQueryable就像一个GOD对象。很难找到100%完整的实现(即使在所有OR/M中)。您可以直接公开ORM而不是使用它,否则您可能会得到一个有漏洞的抽象层。Joel说得最好(来自维基百科文章的文字):在Spolsky的文章中,他提到了许多在大多数情况下都有效的抽象示例,但不能忽视底层复杂性的细节,推动复杂性,因为抽象本身应该简化软件Joels博客发布第二种方法更容易实现并保持抽象不变。更新您的存储库违反了单一职责原则,因为它需要更改有两个原因。第一个是更改ProductsAPI,另一个是更改PromoCodeAPI。您应该使用两个不同的存储库,例如:interfaceIProductRepository{IEnumerableFindForCategory(intcategoryId);IEnumerableFindAllStartingWith(字符串字母);}interfaceIPromoCodeRepository{IEnumerableFindForProduct(intproductId);接口可以更容易地发现违反SOLID原则的行为,因为类中断往往会使构造函数膨胀。建立共识:第二种选择。除了使用IQueryable到处泄漏查询逻辑之外,正确的难度,TEST和mock非常困难。我个人建议使用第二个示例,这样您就可以将搜索逻辑封装在一个地方,并且调用者的意图由他们调用的方法的名称明确定义。如果您使用第一个示例,您的查询代码将在整个应用程序中泄漏,您最终将重复查询。我建议避免重复。这是第一个目标。如果您有这样的逻辑,即在多个地方都可以找到以某个字母开头的产品,那么这是一种特殊情况,其值被提取到单独的方法中(它还为您的特定情况提供了很好的描述)。没有重复的代码更容易更改、理解和维护。因此,我倾向于使用IQueryable的通用搜索方法和一组多次使用的方法:interfaceIRepository{IQueryableFindAll();}interfaceIProductRepository:IRepository{IEnumerableGetProductsInCategory(intcategoryId);IEnumerableGetProductsStartingWith(字符串字母);获取产品促销代码(intproductId);还要考虑单元测试。特定方法比IQueryable更容易模拟。其实我觉得第一个更好。我假设以下因素影响我的决定:如果要重构产品结构:如果有很多人以多态方式派生你想要迭代的接口:弹性所以我建议你从IQueryable作为你的默认选择,并且随着代码的进展,您始终可以更改为您需要的更具体的IEnumerables方法。以上就是《C#学习教程:Repository模式实现共享》的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
