我是NHibernate(和ORMS)的新手,并试图掌握它提供的无数种不同选择。作为引用,我将Fluent NHibernate与单独的业务对象配合使用,而后者又将DTO纯粹用于数据访问。我的应用程序体系结构必须同时支持Windows和Web“前端”。
我的选择是一般方法之一,因为似乎有很多选择。我的DTO看起来像下面的示例。每个DTO都有对ISession的引用,该引用从BO传递给他们。他们负责自己的加载和保存:
public class EmployeeDTO...
// Data Properties to be persisted to the database
public virtual int Id { get; private set; }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
public virtual ISession Session { get; set; }
// Save logic
public virtual void Save()
{
var transaction = Session.BeginTransaction();
Session.SaveOrUpdate(this);
transaction.Commit();
}
// Load logic
public virtual void Load(int id)...
首先:
这是正确的方法吗-DTO是否应具有保存和加载自身的能力?
其次:
无论保存/加载代码在哪里,您是否应在生命周期或对象中使用相同的ISession,还是应该对ISessionFactory进行引用,并在每次需要数据库交互时打开一个新 session ?
// Open a new session every time I interact with the repository
var session = FluentSupport.SessionFactory.OpenSession();
var transaction = Session.BeginTransaction();
Session.SaveOrUpdate(this);
transaction.Commit();
session.Close();
// Close the session when I'm done
当然总会有选项3,以上都不是:)
最佳答案
通常,DTO不包含行为(如“保存”,“加载”),也不包含有关它们如何持久化的知识(ISession)。听起来您真正创建的是一个数据层。理想情况下,您的业务层也不应对ISession有所了解。就是说,您可以根据需要将所有层次简化为所需的快捷方式,但是如果您的ORM遍历所有图层,以后可能很难更改为其他ORM。
对于ISession生命周期管理,您必须确定是否要使用UnitOfWork模式,该模式基本上说每个用户请求都获得一个新的ISession。 ISession生命周期还有其他选择,您在这方面确实不受限制。通常,关于Web应用程序,Windows应用程序以及其他任何应用程序类型,可能都有最佳实践,但是您没有指定要编写的内容。