我是新来的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应用程序。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top