当前位置: 首页 > 面试题库 >

构建NHibernate DTO的最佳方法

唐修明
2023-03-14
问题内容

我是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进行引用并打开一个新会话?

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



 类似资料:
  • 问题内容: 你将如何为Java应用程序实现插件系统? 是否有一个易于使用的(对于开发人员而言)系统可以实现以下目的: 用户将其插件放入应用程序的子目录中 插件可以提供配置屏幕 如果使用框架,那么许可证是否与商业开发兼容? 问题答案: 首先,你需要一个所有插件都需要实现的接口,例如 然后,插件作者应将其插件捆绑到JAR文件中。你的应用程序将打开JAR文件,然后可以使用JAR清单中的属性或JAR文件中

  • 我更喜欢第一种方式,因为我认为在构建器中重复它们是多余的。第一种方法是否存在一些缺点? 提前谢谢,抱歉我的英语不好。

  • 问题内容: 我正在将我的ASP.NET Core应用程序升级到V3,并使用Visual Studio 2019进行开发/调试。除此之外,整个过程很顺利: UseWebpackDevMiddleware不再是:https : //github.com/aspnet/AspNetCore/issues/12890。 我现在希望了解每次调试时VS运行webpack的最佳方法,最好是仅在已更改的JS代码上

  • 问题内容: 按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 我一直在阅读有关使用PHP创建PDF文件的信息,并且想知道最简单的选择是什么。 创建PDF模板,将其打开并替换占位符文本-我应使用哪个功能打开现有PDF进行编辑

  • 问题内容: 我们在同一个SVN存储库中有一个包含两个子项目的项目。例如: 项目的构建应包括两个子项目的构建结果。为了使构建速度更快,我仅在分别更改了SVN的情况下(在svn:// ip / svn / trunk / subproject1中)才运行subproject1的构建。对于subproject2同样 最好的方法是什么?我可以做一份工作吗?在这种情况下,我应该如何定义构建触发器? 还是我需

  • 本文向大家介绍ThreadPoolExecutor 创建方法最佳实践?相关面试题,主要包含被问及ThreadPoolExecutor 创建方法最佳实践?时的应答技巧和注意事项,需要的朋友参考一下 在《阿里巴巴 Java 开发手册》“并发处理”这一章节,明确指出线程资源必须通过线程池提供,不允许在应用中自行显示创建线程。 为什么呢? 使用线程池的好处是减少在创建和销毁线程上所消耗的时间以及系统资源开