2

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

4

1 回答 1

3

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

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

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

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<T>类型,以确保初始化是线程安全的。然后,您可以调用NHibernateSessions.Factory以获取在整个应用程序中重复使用的单例工厂。

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

于 2012-07-15T19:32:50.557 回答