【发布时间】:2010-11-25 15:44:18
【问题描述】:
使用 NHibernate(或任何其他 ORM)消除了 DAL 的必要性,我说得对吗? 还是不行?
【问题讨论】:
标签: nhibernate data-access-layer
使用 NHibernate(或任何其他 ORM)消除了 DAL 的必要性,我说得对吗? 还是不行?
【问题讨论】:
标签: nhibernate data-access-layer
我试图考虑如何回答这个问题但答案是否定的在代码中调用了 sql 代码或正在调用存储的 procs。
然后用可能来自多个表的数据构造一个 Bill 业务对象,然后将其返回。这是一项艰巨的工作,而且通常需要自行维护。
NHibernate 将繁重的工作从这项任务中解脱出来(并做其他事情),但您仍然可能希望“管理器”类作为数据访问层的一部分在对象返回之前进行操作等。
尽管我在解释它方面做得很糟糕,但 NHibernate 并没有消除对 DAL 的需求,它只是改变了 DAL 的组成部分。
【讨论】:
您需要一个 DAL,问题是您在 DAL 中做什么。在一个带有 NHibernate 的 .NET 项目中,我使用了这个组织
我给你举个例子,我想获取所有活跃的员工并对它们进行排序。
在我的 UI 中,我调用 MyProject.Service.EmployeeService.GetActive();在 getGetActive 中,我调用 PyProject.Repo 中的一个函数来获取活跃的员工。当我返回结果时(在服务方法中),我使用 Linq 进行排序并返回排序的列表。
要恢复,Repo 项目,它是通过 NHibernate 访问数据库和服务它的业务。
这是我的看法,我这样做可能不是最好的方式,也不是唯一的方式,但这是我的方式:)
【讨论】:
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。这是一个自以为是的话题。
在查询的过程中,主观性继续存在。有些人更喜欢在存储库上使用专门的查询方法。其他人更喜欢将查询作为自己的对象(查询对象)。没有正确或错误的答案。
【讨论】: