建设NHibernate的DTO的最佳做法(Best approach for building N

2019-07-21 05:52发布

我是新来的NHibernate(和运筹学和管理学),并试图来与它呈现出不同的选项无数交手。 作为参考,我用流利的NHibernate的配有独立的业务对象这反过来使用DTO的纯粹的数据访问。 我的应用程序的架构必须同时支持Windows和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,以上都不是:)

Answer 1:

在一般情况下,DTO的不包含的行为(如保存,载入),不包含他们得到怎样坚持(的Isession)的知识。 这听起来像你真正创建一个数据层。 业务层非常不应该知道的Isession无论是。 这就是说,你可以通过快捷键这个分层所有你想要的,因为它符合您的需求,但它可能会很难改变到一个不同的ORM以后,如果你的ORM流血通过所有图层。

对于ISession的生命周期管理,你必须决定,如果你要使用的UnitOfWork模式,基本上是说,每用户请求获得一个新的ISession。 有针对的Isession终生其他选择,你真的没有这方面的限制。 通常情况下,有可能是围绕Web应用程序与Windows的最佳实践的应用程序与任何其他应用程序类型,但你没有指定哪个你写。



Answer 2:

保持你的加载/保存代码从您的DTO分开。 的DTO对象是基础数据的唯一视图

如果做你的查询,通过使用转换返回的DTO。 事情是这样的:

resultSet = session.CreateCriteria(typeof(MyDataObject))
    .Add(query criteria, etc.)
    .SetResultTransformer(Transformers.AliasToBean<MyDTOObject>())
    .List<IMyDTOObject>()


Answer 3:

DTO的意图是“数据传输对象”。 也就是说,用于在系统中传递周围值的值或集合哑对象。 他们不应该负责自己的坚持,甚至在你的域名映射层1-1到域对象。



Answer 4:

该的ISession是非常便宜的打开/关闭。 以保持它的开放时间过长的问题是,连接池不能重用,直到它的连接超时或什么不是。 这可能是在多用户应用程序的问题。

在您的情况我可能会去一个面向服务的方法来存储检索数据。 这意味着DTO只会在服务边界内部使用。 如果您需要复制看起来相同的对象,我建议你看看AutoMapper这是为这一特定目的而创建的。 如果你只或网络唯一项目有窗户那么它是没有问题的。 当你混合它。 你不能处理会话以同样的方式在一个Windows应用程序作为一个Web应用程序。



文章来源: Best approach for building NHibernate DTO's