【问题标题】:C# NHibernate architecture, three tier applicationC# NHibernate 架构,三层应用程序
【发布时间】:2011-05-24 10:03:13
【问题描述】:

我需要一些建议,我们如何在表示层中解耦 nHibernate 依赖项。目前我们有一个三层 C# winforms 应用程序,包括(简化)以下层;

  • 用户界面 (UI)
  • 业务逻辑 (BAL)
  • 数据访问逻辑 (DAL)

我们正在将此应用程序迁移到 ORM (nHibernate),理想情况下希望只有 DAL 引用 nHibernate。我们还希望使用 nHibernate 中包含的“工作单元”功能,采用“会话每个会话”方法。

要实现这一点,我们需要在 UI 中创建并打开一个会话,将会话通过 BAL 传递给 DAL,但是如果不在 BAL 和 DAL 中创建对 nHibernate 的依赖项,我们就无法实现这一点。

任何建议将不胜感激。我们应该如何构建架构以避免在 UI 和 BAL 中对 nHibernate 的任何引用。有什么想法吗?

我还必须补充一点,我们也不希望 UI 引用 DAL。

UI => BAL => DAL

【问题讨论】:

  • 您所要求的并没有真正的意义(尽管我确实理解您正在努力完成的工作,因为我去过那里)。这可能是可行的,但可能很难理解实现细节,而且它提供的回报很少。我的建议:让您的 UI 层了解 NHibernate,但尽量减少该层中 NHibernate 的使用。

标签: c# nhibernate architecture unit-of-work


【解决方案1】:

不可能这样做,因为 UnitOfWork 模式是由 NHibernate 的 Session 对象实现的。 但是,您只想从您的 DAL 中引用 NHibernate,这是非常没用的,因为您的 DAL 对应用程序的上下文一无所知,而此上下文对于使用 UnitOfWork 是必需的。

【讨论】:

    【解决方案2】:

    看看NHibernate 3.0 Cookbook,我发现它对于掌握 NHibernate 非常有用。

    您需要提取实体并创建 POCO(普通旧 CLR 对象)。您的 UI 不需要任何 NHibernate 知识。您将在数据层中创建方法来操作数据。

    【讨论】:

      【解决方案3】:

      在单独的类库中配置您的 IoC 容器,例如使用此处描述的“GuyWire”模式:

      http://nhforge.org/blogs/nhibernate/archive/2009/11/07/nhibernate-and-wpf-the-guywire.aspx

      【讨论】:

        【解决方案4】:

        我最近在 asp.net mvc 应用程序中使用 nhibernate 构建了一个解耦架构示例。它使用存储库模式和单独的工作单元。大多数这些概念也应该可以在胖客户端中重用。这是我博客上的搜索链接,其中包含可能有趣的帖子。

        http://blog.bobcravens.com/?s=Nhibernate

        希望这能让你开始。如果您有任何问题,请告诉我。

        鲍勃

        【讨论】:

        • 感谢 Bob,刚刚阅读了您的博客 blog.bobcravens.com/2010/06/…,我注意到您的测试层需要依赖于 NHibernateHelper。由于测试项目类似于 UI 层,您是说 UI 层需要对 ORM 项目的引用,在我们的例子中是 DAL。
        • 我使用 IOC 容器来创建存储库的休眠实例。这是在应用程序启动时完成的。这是唯一引用 nhibernate 库的类。应用程序的所有其他区域都引用了 repo 接口。重要的是 nhibernate 特定代码被隔离到一个区域。
        • 如果您在单独的类库(“GuyWire”模式)中配置 IoC 容器,通过反射调用,那么您甚至可以消除从 UI 层到 NH 库的单一引用。跨度>
        • 我同意这是可能的。您仍然需要在配置文件中指定类型并部署 dll。这种提供者模式的好处是能够热线回购。这增加了复杂性,如果您不需要多种类型的存储库,我会选择不太复杂的解决方案 (IMO)。
        猜你喜欢
        • 1970-01-01
        • 2014-05-28
        • 2012-11-30
        • 2011-06-02
        • 2013-06-09
        • 2018-08-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多