我是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应用程序以及其他任何应用程序类型,可能都有最佳实践,但是您没有指定要编写的内容。

10-08 19:42