我是否正确使用NHibernate(或任何其他ORM)消除了DAL的必要性? 或者不是?
答案 0 :(得分:7)
我试图想出如何回答这个问题,但答案是否定的,它不会删除DAL的必要性,而不是成为DAL的一部分,你在做什么之前无疑有访问对象在代码中调用sql代码或调用存储过程。
然后构建了一个Bill业务对象,其数据可能来自多个表,然后返回。这是一项艰苦的工作,通常只涉及维护。
NHibernate将繁重的工作从这项任务中解脱出来(并做其他事情),但你仍然可能希望“Manager”类作为数据访问层的一部分,在返回对象之前进行操作等。
所以虽然我在解释它的过程中做得非常糟糕,NHibernate并没有消除对DAL的需求,它只是改变你的DAL所构成的。
答案 1 :(得分:6)
你需要一个DAL,问题是你在DAL做什么。在使用NHibernate的.NET项目中,我使用了这个组织
我举个例子,我想让所有活跃的员工进行排序。
在我的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。这是一个自以为是的主题。
在查询的过程中,主观性仍在继续。有些人喜欢在存储库上使用专门的查询方法。其他人更喜欢将查询作为自己的对象(查询对象)。没有正确或错误的答案。