2010-12-02 13 views
3

Fluent nHibernate/ASP.NET MVCを使用してアプリケーションを構築しています。私は掘り出したことがあり、永続的なSessionFactoryを開いてから、データベースへのリクエストごとにセッションを使用します。さて、これは良いと思います...「Permanent」SessionFactory、ASP.NET MVC、およびnHibernate

これを達成する方法はかなり混乱しています。私が見つけたものは、何らかのIoCコンテナシステムを使用する構造化フレームワーク全体を前提としています。このようなデザインを実装する方法の簡単な例はありますか?

私はWhere can I find a good NHibernate and ASP.NET MVC Reference Application

を見て撮影しさえブック「アクションでASP.NET MVC」を読んで、それは一例だきているだけで、はるかに複雑な私が達成しようとしているものよりも。私はシングルトンモデルが 'global.asax'のApplication_Startで動作すると思っていましたが、それは私が望んでいた結果をもたらしませんでした。それは私の工場を廃棄し続け、決してそれを作り直すことはありません。

答えて

5

あなたはシングルトンとしてISessionFactoryを公開することができます:

public sealed class FactoryManager 
{ 
    private static readonly ISessionFactory _instance = CreateSessionFactory(); 

    static FactoryManager() 
    { } 

    public static ISessionFactory Instance 
    { 
     get { return _instance; } 
    } 

    private static ISessionFactory CreateSessionFactory() 
    { 
     // TODO: configure fluentnhibernate and create a session factory 
    } 
} 

今すぐあなたのコード内でFactoryManager.Instanceを使用することができます。

using (var session = FactoryManager.Instance.OpenSession()) 
using (var tx = session.BeginTransaction()) 
{ 
    // TODO: use the session here 
    tx.Commit(); 
} 
+0

いつも「開く」と「閉じる」セッションをしたいですか?私が愚かに聞こえるならば、私はごめんなさい、これは私が把握するのは非常に難しいです。 SessionFactoriesはセッションを作成し、セッションは「使い捨て」ですが、私は工場をSingletonのままにしますか? – Ciel

+0

セッションファクトリは、作成するための高価なリソースです。そのため、アプリケーションの存続期間中に一度作成して再利用することをお勧めします。スレッドセーフでもあります。セッションは、データベースにアクセスする必要があるたびに、セッションファクトリを使用して作成されます。それらは非常に高速に作成でき、すべてのクエリで開いたり閉じたりできます。セッションファクトリとは異なり、セッションはスレッドセーフではありません。 –

+0

これはまさに私がやりたいことです。私はちょうど私のテストコードで頻繁に再現されている工場で問題が発生している。実際のシナリオでは、それは起こるべきではありません、そうですか?私はアプリケーションを頻繁に起動していないので、Webサイトを再起動しないと呼び出されてはいけません。 – Ciel

2

グローバルMvcApplicationクラスの静的のgetSessionFactoryメソッドを作成します。このメソッドは、セッションファクトリを初めて呼び出すときに初期化し、プライベート静的変数として格納します。その後の呼び出しでは、単に静的変数を返します。

このメソッドは、オブジェクトがnullであるか、必要に応じて破棄して再作成するかを確認することもできますが、変数は静的であり、したがってアプリケーションの存続期間中存続するため発生しません。

関連する問題