【问题标题】:NHibernate removes DAL?NHibernate 删除 DAL?
【发布时间】:2010-11-25 15:44:18
【问题描述】:

使用 NHibernate(或任何其他 ORM)消除了 DAL 的必要性,我说得对吗? 还是不行?

【问题讨论】:

    标签: nhibernate data-access-layer


    【解决方案1】:

    我试图考虑如何回答这个问题但答案是否定的在代码中调用了 sql 代码或正在调用存储的 procs。

    然后用可能来自多个表的数据构造一个 Bill 业务对象,然后将其返回。这是一项艰巨的工作,而且通常需要自行维护。

    NHibernate 将繁重的工作从这项任务中解脱出来(并做其他事情),但您仍然可能希望“管理器”类作为数据访问层的一部分在对象返回之前进行操作等。

    尽管我在解释它方面做得很糟糕,但 NHibernate 并没有消除对 DAL 的需求,它只是改变了 DAL 的组成部分。

    【讨论】:

      【解决方案2】:

      您需要一个 DAL,问题是您在 DAL 中做什么。在一个带有 NHibernate 的 .NET 项目中,我使用了这个组织

      • MyProject.Core.DomainModel : 在这个项目中只有 .cs 和映射文件 (.hbm.xml)
      • MyProject.Repo :在此类中,您使用 NHibernate 方法,例如 Get、Load、查询 ....
      • MyProject.Service :从这些类中,我调用 MyProject.Repo 方法
      • MuProject.UI:ASP.NET、ASP.NET MVC、Winforms .....
      • MyProject.Service.Tests : 测试服务的所有单元测试

      我给你举个例子,我想获取所有活跃的员工并对它们进行排序。

      在我的 UI 中,我调用 MyProject.Service.EmployeeService.GetActive();在 getGetActive 中,我调用 PyProject.Repo 中的一个函数来获取活跃的员工。当我返回结果时(在服务方法中),我使用 Linq 进行排序并返回排序的列表。

      要恢复,Repo 项目,它是通过 NHibernate 访问数据库和服务它的业务。

      这是我的看法,我这样做可能不是最好的方式,也不是唯一的方式,但这是我的方式:)

      【讨论】:

        【解决方案3】:

        NHibernate ISession 可以用作工作单元和简单的 IRepository。从这个意义上说,它可以取代一些普通的 DAL 东西。

        例如:

        using(var uow = new UnitOfWork())
        {
            var customerRepository = new Repository<Customer>(uow);
            var customer = customerRepository.Get(id);
            customer.DoSomething();
            uow.commit();
        }
        

        可能是:

        using(var session = sessionFactory.OpenSession())
        {
            using(var tx = session.BeginTransaction())
            {
                var customer = session.Load<Customer>(id);
                customer.DoSomething();
                tx.commit();
            }
        }
        

        显然,您仍想控制谁“知道”什么是 ISession,因此有理由在您的代码中保留 DAL 的概念。但是您已经删除了 UoW 和存储库代码,让 NHibernate 为您完成。它确实模糊了一些东西。

        即使使用 NHibernate,大多数人仍然使用 IRepository。这是一个自以为是的话题。

        在查询的过程中,主观性继续存在。有些人更喜欢在存储库上使用专门的查询方法。其他人更喜欢将查询作为自己的对象(查询对象)。没有正确或错误的答案。

        【讨论】:

          猜你喜欢
          • 2010-09-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-26
          • 2011-02-28
          • 1970-01-01
          • 2023-04-06
          • 2011-01-30
          相关资源
          最近更新 更多