NHibernate删除了DAL?

时间:2009-09-04 14:07:28

标签: nhibernate data-access-layer

我是否正确使用NHibernate(或任何其他ORM)消除了DAL的必要性? 或者不是?

3 个答案:

答案 0 :(得分:7)

我试图想出如何回答这个问题,但答案是否定的,它不会删除DAL的必要性,而不是成为DAL的一部分,你在做什么之前无疑有访问对象在代码中调用sql代码或调用存储过程。

然后构建了一个Bill业务对象,其数据可能来自多个表,然后返回。这是一项艰苦的工作,通常只涉及维护。

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

所以虽然我在解释它的过程中做得非常糟糕,NHibernate并没有消除对DAL的需求,它只是改变你的DAL所构成的。

答案 1 :(得分:6)

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

  • MyProject.Core.DomainModel:在此项目中只有.cs和映射文件(.hbm.xml)
  • MyProject.Repo:在这个类中你使用像Get,Load,make query这样的NHibernate方法....
  • 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和服务访问数据库是业务。

我认为,就像我这样做可能不是最好的方式,不是唯一的方式,但这是我的方式:)

答案 2 :(得分:2)

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和Repository代码,让NHibernate为你做。它确实模糊了一些事情。

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

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