NHibernate和DAL?

NHibernate和DAL?,nhibernate,data-access-layer,Nhibernate,Data Access Layer,使用NHibernate(或任何其他ORM)消除DAL的必要性,我说得对吗? 是否?我试图思考如何回答这个问题,但答案是否定的,它不会消除DAL的必要性,而不是成为DAL的一部分,您之前所做的毫无疑问是拥有调用sql代码内置代码或调用存储过程的access对象 然后,它用可能来自多个表的数据构造一个Bill业务对象,然后返回该对象。这是一项艰巨的工作,通常需要自行维护 NHibernate将繁重的工作从这个任务中解脱出来(并做其他事情),但您可能仍然希望“管理器”类作为数据访问层的一部分,在返回

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

我试图思考如何回答这个问题,但答案是否定的,它不会消除DAL的必要性,而不是成为DAL的一部分,您之前所做的毫无疑问是拥有调用sql代码内置代码或调用存储过程的access对象

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

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


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

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

  • MyProject.Core.DomainModel:在此项目中,仅.cs和映射文件(.hbm.xml)
  • Repo:在这个类中,您使用NHibernate方法,比如Get、Load、makequery
  • 服务:从这些类中,我调用MyProject.Repo方法
  • MuProject.UI:ASP.NET、ASP.NET MVC、Winforms
  • MyProject.Service.Tests:测试服务的所有单元测试
我给你们举个例子,我想让所有活跃的员工,并对他们进行排序

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

要恢复回购项目,它需要通过NHibernate访问数据库,并为业务提供服务


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

NHibernate会话可以用作一个工作单元和一个简单的假设。从这个意义上说,它可以取代一些平凡的东西

例如:

using(var uow = new UnitOfWork())
{
    var customerRepository = new Repository<Customer>(uow);
    var customer = customerRepository.Get(id);
    customer.DoSomething();
    uow.commit();
}
使用(var uow=new UnitOfWork())
{
var customerRepository=新存储库(uow);
var customer=customerRepository.Get(id);
customer.DoSomething();
提交();
}
可以是:

using(var session = sessionFactory.OpenSession())
{
    using(var tx = session.BeginTransaction())
    {
        var customer = session.Load<Customer>(id);
        customer.DoSomething();
        tx.commit();
    }
}
使用(var session=sessionFactory.OpenSession())
{
使用(var tx=session.BeginTransaction())
{
var customer=session.Load(id);
customer.DoSomething();
tx.commit();
}
}
显然,您仍然希望控制谁“知道”ISession是什么,因此有理由在代码中保留DAL的概念。但您已经删除了UoW和存储库代码,只让NHibernate为您完成。它确实模糊了一些东西

大多数人即使与NHibernate一起使用IRepository。这是一个固执己见的话题

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