2011-02-03 6 views
0

私はNHibernateはのStructureMapを使用していると私は新しいセッション毎回を構築するためのツールが必要とされている指示したい、と配置されている場合のみ。
私はいくつかのコードで説明しようとします(これはコンソールアプリケーションです)。
に指示のStructureMap(配置された場合にのみ)、新しいセッションを作成するための

私はこの方法(ConnDbは私の接続文字列である)私のセッションファクトリを構築する:

For<ISessionFactory>() 
.Singleton() 
.Use(() => new NHSessionFactory(ConnDb, true).SessionFactory); 

、これは私がセッションを構築するために使用するコードですと、期待どおり

For<ISession>() 
    .Singleton() 
    .Use(x => x.GetInstance<ISessionFactory>().OpenSession()); 

すべてが動作します私はセッションを破棄しませんが、このようなことをしたいと思います:

using (session) 
    { 
     using (var tx = session.BeginTransaction()) 
     { 
      // DO SOMETHING 
      tx.Commit(); 
     } 
    } 

    using (session) 
    { 
     using (var tx = session.BeginTransaction()) 
     { 
      // DO SOMETHING 
      tx.Commit(); 
     } 
    } 
For<ISession>() 
    .AlwaysUnique() 
    .Use(x => x.GetInstance<ISessionFactory>().OpenSession()); 

が、私は今、新しいセッションがアクティブな1があります場合でも、作成されたことに気付きました:私はこのように、セッションのためのコードを変更しようとしました。 私の状況では、サービスロケータでISessionを解決する別のコンポーネント(Rhino.Security)を参照しています。

答えて

1

セッションは、クライアントではなく、セッションの作成者によって処理される必要があります。セッションを作成して同じスコープ内に配置するようにアーキテクチャを改訂することを検討する必要があります。

セッションの寿命は、それを使用するコンポーネントに合わせて制限する必要があります。 1つのグローバルセッション(シングルトン試行の場合と同様)を持つことにより、セッションはアプリケーションの有効期間中にいつでもアクセスしたすべてのエンティティへの参照を保持し、メモリを効果的に使い果たします。また、セッションが例外をスローすると、未定義の状態になり、アプリケーション全体が停止します。

デスクトップアプリケーションでNHibernateを使用する方法については、Ayendeのarticle in MSDN magazineをお読みください。彼が与えるアドバイスは、あなたのシナリオにも当てはまる可能性が高いことです。

StructureMapでセッションを処理する場合Jeremy Millerは、ネストされたコンテナを使用して寿命を制御する方法について、blog postを持っています。アプリケーションが単純な場合、Jeremyの例はおそらく過剰です。おそらく、アプリケーションのコンポーネント/コマンドごとに1つのセッションを注入することに焦点を合わせるべきです。

関連する問題