建设NHibernate的DTO的最佳做法
-
20-09-2019 - |
题
我是新来的NHibernate(和运筹学和管理学),并试图来与它呈现出不同的选项无数交手。作为参考,我用流利的NHibernate的配有独立的业务对象这反过来使用DTO的纯粹的数据访问。我的应用程序的体系结构必须支持两个窗口和web“前端”。
我奎德里是一般的方法中的一个作为似乎有这么多的选择。我的DTO的类似于下面的示例。每个DTO具有被传递给它们从BO一个ISession的参考。他们负责自己的加载和保存:
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并打开需要每次数据库交互的一个新的会话?
// 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的最佳实践的应用程序与任何其他应用程序类型,但你没有指定哪个你写。
其他提示
请您加载/保存代码从您的DTO分开。在DTO对象仅基础数据的观点
在做你的查询,通过使用转换返回的DTO。是这样的:
resultSet = session.CreateCriteria(typeof(MyDataObject))
.Add(query criteria, etc.)
.SetResultTransformer(Transformers.AliasToBean<MyDTOObject>())
.List<IMyDTOObject>()
DTO的意图是“数据传输对象”。也就是说,用于在系统中传递周围值的值或集合哑对象。他们不应该负责自己的坚持,甚至在你的域名映射层1-1到域对象。
在的Isession是非常廉价的,以打开/关闭。以保持它的开放时间过长的问题是,连接池不能重用,直到它的连接超时或什么不是。这可能是在多用户应用中的问题。
在您的情况我可能会去一个面向服务的方法来存储检索数据。这意味着DTO只会在服务边界内部使用。如果您需要复制看起来相同的对象,我建议你看看 AutoMapper 这是用于创建这一特定目的。如果你只或网络唯一项目有窗户那么它是没有问题的。当你混合它。你不能处理会话以同样的方式在一个Windows应用程序作为一个Web应用程序。