【问题标题】:ASP.NET MVP with NHibernate and Spring.NET. Is OSIV necessary?带有 NHibernate 和 Spring.NET 的 ASP.NET MVP。 OSIV 有必要吗?
【发布时间】:2011-11-15 21:50:35
【问题描述】:

我正在尝试将 NHibernate 集成到现有的 ASP.NET 项目中,该项目已经使用 Spring.NET 和 MVP 模式来实现关注点的清晰分离。换句话说,在我的任何演示者/视图中都没有数据访问代码或对此的认识,我希望保持这种状态。

但是,Spring.NET 源代码附带的 Spring.Northwind.Web 示例具有每个 Web 控制器(即 Presenter)将 NHibernate ISessionFactory 对象作为构造函数依赖项。根据我有限的阅读量,如果想使用 OSIV,这种耦合似乎是必要的。假设我不想 OSIV(仍在阅读此内容),我可以安全地从我的表示层中删除 ISessionFactory 依赖项吗?如果更有经验的 NHibernaters 能够提出不使用 OSIV 或任何其他与此堆栈有关的问题的利弊和后果,我将不胜感激。

非常感谢。

【问题讨论】:

    标签: asp.net nhibernate mvp spring.net


    【解决方案1】:

    我认为您所做的以下假设不正确:

    但是,Spring.Northwind.Web 示例随 Spring.NET 源代码中的每个 Web 控制器(即 Presenter)都采用 NHibernate ISessionFactory 对象作为构造函数依赖。

    示例项目中有一个“控制器”:NHibernateCustomerEditController。还有这个indeed is injected with a session factory。但是,这不是您假设的“演示者”意义上的控制器:它是一个实用程序类,用于管理用户会话中的 CurrentCustomer - 它演示了会话范围对象的使用。

    这个例子没有使用 MVP 模式;对服务和存储库 (DAO) 的依赖被直接注入到页面中。

    Open session in view (OSIV) 是作为 http 模块实现的,因此它不需要在每个页面(或页面展示器,如果您应用 MVP)上注入会话工厂 - “它就在http 上下文”。

    在您的情况下(我假设)服务被注入到您的演示者;这些服务可能依赖于需要SessionFactory 的 DAO。 没有要求在每个演示者或页面上注入 SessionFactory:您可以继续进行“正常”di 配置,无论是否应用 OSIV。您的表示层不需要依赖任何类型的SessionFactory

    【讨论】:

      【解决方案2】:

      坦率地说,我不会将NHibernateASP.NET MVP 以这种方式耦合,前者是 ORM,而后者是表示层框架,不应绑定和依赖于任何特定的数据访问技术。

      在此处阅读我的答案:MVC3 and Entity Framework 这对于任何 UI 技术或 ORM / DAL 技术都是有效的,其想法是以 UI(MVP、MVC、WebForms、WPF、Jquery、Windows Forms, SL...) 不依赖和了解特定的数据访问和数据库引擎详细信息。

      【讨论】:

      • 我完全同意。但是,我的问题是这种解耦是否可以在不丢失 NHibernate 功能的情况下完成。 “Open Session In View”的丢失似乎是主要的受害者。这是正确的吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-13
      • 1970-01-01
      • 1970-01-01
      • 2016-10-03
      相关资源
      最近更新 更多