【问题标题】:Recommended IRepository and IRepository<T> interface in C#C# 中推荐的 IRepository 和 IRepository<T> 接口
【发布时间】:2011-10-11 16:42:19
【问题描述】:

我正在为我的 mvc Web 应用程序寻找一个简单的 IRepository 接口, 我已经做了很多搜索,有多少人就有多少意见。 所以我决定请教专家

如果能推荐一个常用的IRepository和IRepository接口,回答基本的CRUD和查询操作(支持过滤)。

如果您知道还包含实现并且可以与 EF 4 一起使用的框架,如果您能提及它们,我会很高兴。

谢谢。

编辑: 正如@Ladislav 建议的那样,有什么替代方法,总是从我的代码中调用 linq 到 ADO.net 调用?使用 POCO 存储库从我的业务模型中抽象创建自定义 POCOS 是一个好主意吗?我有一个 Jewel POCO 类需要从不同的数据库条目中解析,这是我不能的遗留系统的常见做法接触数据库架构,但只接触演示

【问题讨论】:

  • 这对 SO 来说真的不是一个合适的问题。太主观了。
  • 我正在寻找最好的界面,所以它更像是一个建议而不是一个问题
  • @David,有很多意见的事实应该告诉你,没有“最好的界面”。不同的情况需要不同的解决方案,不同的人有不同的偏好。
  • 我同意,我正在为在线商店寻找一个简单但足够强大的界面,我正在寻找想法,我无法自行决定,因为我缺乏该模式的经验。跨度>

标签: c# entity-framework repository repository-pattern


【解决方案1】:

停止。模式应该在需要时使用——当它们解决一些常见问题时——而不是因为它们存在。您目前显然不需要它,因为您没有编写存储库应该为您解决的任何单一需求 - 如果您想选择一个“好的”开始,这些需求至关重要。无论如何,好的一个通常会在您的开发过程中发展,通常不会预先定义。

带有 EF 的通用存储库也是我在自己的项目中使用过的最愚蠢的模式之一。最好只是成为特定存储库的父级。它仅适用于您通常根本不需要存储库的基本场景。

阅读内容:What is the point of generic repository

【讨论】:

  • 我想使用存储库从我更高级的代码中抽象出数据层,我想将它注入到一些使用数据库对象生成具有复杂属性的 POCOS 的类中,这些属性由不同的数据库组成字段
  • 这使得所有常见的引用存储库实现以及通用存储库完全无用,因为这正是您自己的自定义解决方案的要求,其中每个存储库都将完全特定于支持您的自定义对象组合。
  • 我明白你的意思,但我仍然需要为我的应用程序中的每个数据对象创建“自定义”存储库,使用 GetByXXX 方法,因此不会使用通用接口,而是工厂的想法对于我的 POCOS 来说也是可查询的是个好主意吗?
  • 这是为了更大的讨论,也许是为了审查你的要求,所以不适合那个(也许聊天是)。来自多个表的实体的组合应该由 ORM 自己完成。也许您应该对 NHibernate 等其他 ORM 进行一些探索,最终您将获得业务对象和数据库之间的直接映射(EF 也可以这样做,但您需要存储过程来保存实体)。使用额外级别的对象将使您的查询非常复杂且难以使用。
  • 我没有很好地解释自己,我没有从多个表中获取字段,而是从一个表中组合一个带有条件等的新对象,所以我的存储库返回一个比我的更复杂的对象模型,我只想将查询限制为存储库方法(例如 FilterBYXXX ),因此进一步的输出不会更改对象列表,这不是基本存储库模式,而是中间的东西,这有意义吗?
【解决方案2】:

存储库模式非常简单...您真的不需要使用现有框架。您可以自己构建接口。在人们构建自己的博客中有许多很好的例子,并且还允许他们在测试中拥有接近 100% 的代码覆盖率。以下是一些示例(但它们都遵循相似的模式):

Using Repository Pattern with Entity Framework(吉尔芬克)

100% UNIT TESTABLE LINQ TO SQL REPOSITORY (Kazi Manzur Ra​​shid) -- 实际上我在工作中效仿了他的一些例子

Working together: LINQ to SQL, IRepository, Unit Of Work and Dependency Injection(斯图尔特·哈里斯)

还有很多。

我认为自己构建它,特别是如果你只是在学习模式,肯定会教你很多关于模式的知识,并且让你深入了解什么适合你的情况,什么不适合。

我希望这会有所帮助!祝你好运。

【讨论】:

  • 我刚刚浏览了 100% 可单元测试的 linq 到 sql 存储库,以澄清它根本不是可单元测试的,因为它暴露了 IQueryableHere 解释了为什么它不能进行单元测试。
  • 您不是在对数据库上下文进行单元测试 - 您是在对依赖于上下文的代码进行单元测试。如果 dbcontext 对象最初设计正确,它就会被完全模拟,因此不需要通用存储库。事实上,它不是,所以这是下一个最好的事情,恕我直言。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-22
  • 1970-01-01
  • 2018-08-20
  • 1970-01-01
相关资源
最近更新 更多