2011-02-16 13 views
7

要求ごとに終了した後に、structuremapが自分のDataContextを破棄するかどうかを確認したかったのです。ここでStructuremap DataContextオブジェクトの廃棄

は私の設定です

ForRequestedType<MyDataContext>().TheDefault.Is.OfConcreteType<MyDataContext>(); 
SelectConstructor<MyDataContext>(() => new MyDataContext()); 

は自動私のDataContextを配置または私は手動でのDisposeを呼び出す必要がないのStructureMapのでしょう?私は何をすべきかだ

答えて

4

いいえ、ネストされたコンテナを使用し、コンテキストインスタンスを保持するコンテナを廃棄しない限り、自動的に廃棄しません。それを処分するのは文脈の創造者次第です。作成者は通常、ObjectContext.GetInstance<MyDataContext>を呼び出すコードの一部であるか、またはStructMapがオブジェクトのいずれかにDataContextを挿入するルートメソッドです。

一般的なプラクティスは、HttpRequestごとにコンテキストを作成し、要求の最後にコンテキストを配置することです。

+0

ありがとうございます。回答が受け入れられました。 –

9

:使用可能な場合

For<IUnitOfWork>() 
     .HybridHttpOrThreadLocalScoped() 
     .Use<BpReminders.Data.NH.UnitOfWork>(); 

    For<ISession>() 
     .HybridHttpOrThreadLocalScoped() 
     .Use(o => ((BpReminders.Data.NH.UnitOfWork)o.GetInstance<IUnitOfWork>()).CurrentSession); 

と...

protected void Application_EndRequest(object sender, EventArgs e) 
{ 
    ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects(); 
} 

HybridHttpOrThreadLocalScopedのHttpContextを使用しています。

StructureMapはすべてを調べます。 あなたのクラスにIDisposableを実装することを忘れないでください。

+0

HybridHttpOrThreadLocalScopedを使用しているSMでは、ThreadLocalストレージが使用されますが、ReleaseAndDisposeAllHttpScopedObjectsを呼び出すと例外がスローされます。 ThreadLocalに格納されているオブジェクトをどのように処分できたか教えてください。 – Roman

+0

@Am:HybridHttpOrThreadLocalScopedは使用できません.HttpContextLifecycleのメンバーです。 ThreadLocalStorageLifecycle(あなたが興味を持っているThreadLocalStorageLifecycle)には、EjectAllというメソッドがあります。私はそれを使用したことはないと思って、これを実際に掘り下げることはありません。 – LeftyX

関連する問題