私は NHibernate に関する多くの本を読んでいて、Configure() がどのように実装されているかに気付きました。本では、そのメソッドは、アプリケーションがコンソール アプリケーションで実行されるたびに呼び出されます。ASP.NET の例のオンラインのほとんどは、すべてのページ要求で Configure() を呼び出します。リクエストごとにNHibernateを構成する必要があるため、これには多くのオーバーヘッドがあると思います。すべてのページ要求で NHibernate が構成されているかどうかは重要ですか? そうでない場合、どのように設定を保存しますか? asp.net mvc でアプリケーション全体を保存しますか?
1 に答える
NHibernate は、アプリケーションの開始ごとに 1 回構成するように設計されています。コンソール プログラムの場合、それはプログラムを実行するたびです。ASP.NET アプリケーションの場合は、アプリケーションが起動するたびにApplication.Start
イベントが発生します。
SessionFactory
NHibernate が作成するものは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