gpt4 book ai didi

nhibernate - 构建 NHibernate DTO 的最佳方法

转载 作者:行者123 更新时间:2023-12-04 16:21:47 24 4
gpt4 key购买 nike

我是 NHibernate(和 ORMS)的新手,并试图掌握它提供的无数不同选项。作为引用,我将 Fluent 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 的引用并打开一个新 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 应用程序与任何其他应用程序类型可能存在最佳实践,但您没有指定您正在编写哪种应用程序。

关于nhibernate - 构建 NHibernate DTO 的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1530345/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com