【问题标题】:NHibernate: Configure() in every page request?NHibernate:在每个页面请求中配置()?
【发布时间】:2012-07-16 23:46:47
【问题描述】:

我阅读了很多关于 NHibernate 的书籍,并注意到 Configure() 是如何实现的。在书中,每次应用程序在控制台应用程序中运行时都会调用该方法。大多数 ASP.NET 示例在线调用 Configure() 在每个页面请求上。我认为这会产生很多开销,因为必须在每个请求上配置 NHibernate。是否在每个页面请求上配置 NHibernate 是否重要?如果没有,有人将如何在 asp.net mvc 中保存配置 - 应用程序范围?

【问题讨论】:

  • “大多数在线 ASP.NET 示例都会在每个页面请求上调用 Configure()。” 什么?这些示例在哪里?跨度>
  • 调用 Configure 等每个请求的 SessionFactory 是最差的实践示例。

标签: c# sql-server nhibernate fluent-nhibernate


【解决方案1】:

NHibernate 设计为在每次应用程序启动时配置一次。对于控制台程序,每次运行该程序时都是如此。对于 ASP.NET 应用程序,每次应用程序启动时都会触发 Application.Start 事件。

Configure() 创建的SessionFactory NHibernate 在应用程序的生命周期内可以安全地缓存,并且对于重复创建会话是线程安全的。无需对每个请求进行配置。

以最基本的方式,您可以使用延迟初始化的静态属性来安全地为您的应用程序提供一个单例:

public static class NHibernateSessions
{
    private static readonly Lazy<SessionFactory> lazyFactory;

    static NHibernateSessions
    {
        lazyFactory = new Lazy<SessionFactory >(
            () => NHibernateSessions.CreateSessionFactory());
    }

    public static SessionFactory Factory
    {
        get
        {
            return NHibernateSessions.lazyFactory.Value;
        }
    }

    public static void Initialize()
    {
        if(!NHibernateSessions.lazyFactory.IsValueCreated)
        {
            // Access the value to force initialization.
            var factory = lazyFactory.Value;
        }
    }

    private static SessionFactory CreateSessionFactory()
    {
        // Add code here to configure and create factory.
    }
}

此代码使用Lazy&lt;T&gt; 类型,以确保初始化是线程安全的。然后,您可以调用NHibernateSessions.Factory 来获取在整个应用程序中重复使用的单例工厂。

默认情况下,工厂在第一次获取 Factory 属性时初始化。这意味着对于 ASP.NET 应用程序,尝试使用 NHibernate 的第一个请求将是一个缓慢的请求。如果这是一个问题,您可以在应用程序启动时通过在 Application.Start 事件处理程序中调用 Initialize() 方法来强制初始化。

【讨论】:

  • 请原谅我对这个问题的无知。我会将值存储在哪种全局变量中?将值存储在缓存中似乎并不好,因为缓存可能会被清除。我该怎么做?
  • 我的“缓存”一词并不是指 ASP.NET 缓存 - 如果这令人困惑,请致歉;我已经用一些代码更新了我的答案来帮助你。
猜你喜欢
  • 2021-04-19
  • 1970-01-01
  • 2013-09-19
  • 2015-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-02
相关资源
最近更新 更多