NHibernate:每个页面请求中的Configure()?

时间:2012-07-15 19:27:26

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

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

1 个答案:

答案 0 :(得分:3)

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

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

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