2

私は NHibernate に関する多くの本を読んでいて、Configure() がどのように実装されているかに気付きました。本では、そのメソッドは、アプリケーションがコンソール アプリケーションで実行されるたびに呼び出されます。ASP.NET の例のオンラインのほとんどは、すべてのページ要求で Configure() を呼び出します。リクエストごとにNHibernateを構成する必要があるため、これには多くのオーバーヘッドがあると思います。すべてのページ要求で NHibernate が構成されているかどうかは重要ですか? そうでない場合、どのように設定を保存しますか? asp.net mvc でアプリケーション全体を保存しますか?

4

1 に答える 1

3

NHibernate は、アプリケーションの開始ごとに 1 回構成するように設計されています。コンソール プログラムの場合、それはプログラムを実行するたびです。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 に答える