【问题标题】:ORM Repository PatternORM 存储库模式
【发布时间】:2011-03-01 20:25:23
【问题描述】:

这更像是一个我正在寻找意见的问题。我正在开发一个同时使用 NHibernate 和 EntityFramework 的项目(这是设计使然,需要灵活性)。因此,我继续着手研究存储库模式,但遇到了一个小难题。

基本上,我想知道你们对以下领域的看法:

  1. 存储库应该是单例吗? - 这将允许我保持会话打开,但同时,我认为它将保持打开到数据库的连接。对于 NHibernate,ORM 只能保证一个对象在同一个会话中是相同的。这对于简单的编码来说是理想的,但有明确的方法可以使用键和覆盖 GetHashCode 和 Equals 方法来克服这个问题。

  2. 如果它不是单例(或者即使是),我是否应该在使用连接后立即关闭它们?对于 NHibernate,这意味着每次 Repository 被“Disposed”(每次使用后)都关闭会话。

  3. 您是否为 NHibernate 或 EF 4.0 实现了存储库模式并发现了任何有用的想法?

【问题讨论】:

  • @John:没有 C#.NET 这样的东西。它只是称为“C#”。
  • 显然这是话题,我不确定谁会如此不诚实地投票不是。 @John Saunders 你在吹毛求疵。 C# 是 EMCA 语言规范,然后是 C#.NET,C# 的标准视图损害了 .NET 的所有功能 + 原始语言本身。
  • @Chris:大多数时候有人说“C#.NET”是因为他们知道“VB.NET”并假设命名方案是相同的。他们不是。
  • @Chris:我觉得应该移到 Programmer's,这是一个更适合进行主观讨论的地方。
  • 我的意思是让那些想要了解该主题的人了解我的目标是在 .NET 平台上的 C# 应用程序中实现我的功能。我也暗示 C# 是 .NET,但正如 Chris 所说...我只是想让它清楚,C# 或 .NET 的人看@this,因为我也可以理解 VB.NET 示例...

标签: c# .net nhibernate entity-framework design-patterns


【解决方案1】:

不要自己编写单例的创建(即单例模式本身),使用像 StructureMap 这样的 IOC 框架来处理对象的生命周期管理。

  1. 我们无法回答。如果它是单例的,那么它在内部管理的资源(如数据库实时连接的连接池)必须是线程安全的。线程安全代码并非易事。

  2. 我们无法回答。这取决于你如何处理你的模型。它还取决于您是否希望人们能够通过需要主动连接到数据库的 DataReader 进行阅读。这也会影响延迟加载等需要活动会话的事情,这会成为数据绑定的噩梦。

  3. 以下是我为 NH 创建存储库模式的所有想法:Creating a common generic and extensible NHiberate Repository version 2

【讨论】:

  • 查看您网站上的示例,您的存储库似乎与 nhibernate 紧密相连。我的比较通用,只提供 Save/Delete/ToQueryable。就单例和线程安全而言,这不只是在执行任何非线程安全的操作之前锁定静态对象的问题吗?
  • 锁定变得像您必须保护的资源需要彼此一样复杂。我没有特别说这很难,只是很重要。线程从来都不是微不足道的。还要记住锁定的一点,通过强制单线程访问来使其线程安全可能真的很容易,其中每个消费者都必须等待以前的消费者请求完成;)关于“更通用”的概念存储库在我的 cmets 中有一个讨论。我认为这毫无意义。
  • 如果我真的必须创建另一个抽象层,我会创建一个包装器来包装我的存储库使用情况。在到达虚无之前,您只能抽象出这么多。或者您需要创建一个完整的元 DSL 来查询您必须在 ORM 的最深处转换为实际工作代码/sql 的对象。如果您对此很认真,我会从 DetatchedCriterion 模式开始,然后构建新的标准 -> db 代码转换器(或者可能直接将 NH 的代码直接用于 SQL)
【解决方案2】:

第一个问题,它必须是 NHibernate 吗?为什么不看看将 EF4 与 IoC 结合使用,我最喜欢的是 StructureMap,然后您不必再担心将存储库设为单例,因为 StructureMap 提供了通过请求、HttpContext 和 Hybrid 保持范围打开的选项。您当然可以选择将 Singleton 模式与您的存储库一起使用,我只是不认为在这种情况下它是一个可行的选择。

希望对你有帮助而不是让你感到困惑。

【讨论】:

    猜你喜欢
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    相关资源
    最近更新 更多