NHibernate和DAL?
使用NHibernate(或任何其他ORM)消除DAL的必要性,我说得对吗?NHibernate和DAL?,nhibernate,data-access-layer,Nhibernate,Data Access Layer,使用NHibernate(或任何其他ORM)消除DAL的必要性,我说得对吗? 是否?我试图思考如何回答这个问题,但答案是否定的,它不会消除DAL的必要性,而不是成为DAL的一部分,您之前所做的毫无疑问是拥有调用sql代码内置代码或调用存储过程的access对象 然后,它用可能来自多个表的数据构造一个Bill业务对象,然后返回该对象。这是一项艰巨的工作,通常需要自行维护 NHibernate将繁重的工作从这个任务中解脱出来(并做其他事情),但您可能仍然希望“管理器”类作为数据访问层的一部分,在返回
是否?我试图思考如何回答这个问题,但答案是否定的,它不会消除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:测试服务的所有单元测试
这是我的观点,我是这样做的。这可能不是最好的方式,也不是唯一的方式,但这是我的方式:)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。这是一个固执己见的话题
主观性在质疑的过程中继续。有些人更喜欢在存储库中使用专门的查询方法。其他人更喜欢将查询作为自己的对象(查询对象)。答案没有对错之分