2009-09-02 15 views
1

ここではAutofac初心者ですが、私はこれまでに見たものが好きです。私は解決されたオブジェクトの要求寿命を利用しようとしており、要求が行われた後に実際に処理が行われていることを確認するのに問題があります。autofac、ASP.NET統合、Dispose

私はページリクエストの開始時に取得して最後に処分する使い捨てオブジェクトを持っています。私はautofacを使ってオブジェクトのインスタンスを取得しています。私はautofacが私のために処理を行うかどうかを見たいと思っていました。

私は問題のオブジェクトにDispose()メソッドを実装しました。私のページが生涯管理をしているとき、私はそれを「火」と見ることができます。私は自分自身を処分しないときには証拠を見ませんが、オートファックにそれをさせます。

私はthese命令を使用して、web.configとglobal.asaxの変更を含めて、設定を行っています。オブジェクトをインスタンス化することはできますが、実際に処理されているかどうかはわかりません。別のステップがありますか?

答えて

1

私はそれを理解しました。

オブジェクトインスタンスのWRONGコンテナに質問していました。アプリケーションコンテナに要求コンテナではなくオブジェクトを要求していました。

D'oh!

+1

ええ、この問題は、通常把握するのが大変です。私は通常、サービスロケータ機能の代わりにDI機能を多く使用していますので、これに慣れていません。私は一度、私の開発データベースをロックされて参照されているnhibernateのセッションを持っていた...そこに多くの楽しみ。 – Min

0

Disposeは、 "Dispose"メソッドを定義できるインタフェースです。使い捨てクラスを要求するために最も一般的に使用されるのは、明示的に解放する必要があるクラス内のリソース(Windowsリソースハンドルなど)がある場合です。ほとんどの場合、IDisposableインターフェイスは不要です。ガーベッジコレクタは非常に強力で、メモリを管理する上ではるかに優れた仕事をします。しかし、明らかにハンドルがすぐに解放されなければならないケースがたくさんあります。次のポイント、IDisposableの実装に私をもたらします。

はいけないこと:

var myClass = MyDisposableClass(); 

// do stuff with myClass 

myClass.Dispose(); 


Proper usage: 

using (var myClass = MyDisposableClass()) 
{ 
    // do stuff with myClass 
} 

コンパイラは、効果的に、次のと同じように構築します:

MyDisposableClass myClass = MyDisposableClass(); 
try 
{ 
    // do stuff with myClass 
} 
finally 
{ 
    myClass.Dispose(); 
} 

何が起こるかに関係なく、あなたはあなたの処分になります知っているということで重要な違いと呼ばれる。さらに、デストラクタ(存在する場合はガベージコレクタによって呼び出される)を結びつけることができます。このデストラクタを使用すると、Disposeメソッドを呼び出すことができます。何らかの理由でこれを行う必要がある場合は、同じリソースを2回解放しないでください(解放後にポインタをnullに設定してください)。

+0

時間をいただきありがとうございます。私はどのように処理するのか知っています。私の目標は、ページが使い捨てであるかどうかを知ることなく、インプリメンテーションのイン/アウトを入れ替えることでした。 Autofacのサブコンテナのライフサイクル管理ではこれが行われていますが、ASP.NET統合では要求のライフタイムを管理することになっています。私はちょうどそれが実際に起こっていることを確認したかった。 – n8wrl

1

オブジェクトをページ内に手動で配置するか、またはAutofacモジュールで行うかに関係なく、要求ライフサイクルに関してオブジェクトが配置されるときに違いがあります。 The Autofac ContainerDisposalModuledispose the Request containerではなく、リクエストライフサイクルの最後にあるHttpApplication.EndRequestが呼び出されるまで、そのオブジェクトとともにオブジェクトになります。

オブジェクトのDisposeメソッドへの呼び出しをどのようにトレースしているかにより、出力が表示されない可能性があります。 Disposeメソッドをどのように使用していますか?あなたの再ポストからの回答の

+0

大きな質問、ピーター - 私は3つのことを試みました。最初の2つは、response.writeとhttpcontext.traceは何も示していませんでした。どちらもタイミングで説明できます。しかし、3つ目はイベントログの書き込みで、何も表示されません。 – n8wrl

+0

私は同意します。イベントログへのトレースは、要求ライフサイクルの影響を受けてはなりません。 Hm。 –

1

リピート:

これは、(任意の IoCコンテナに)発生した時間のほとんどは、あなたは 依存関係のチェーンに沿って1つの コンポーネントがシングルトンであることがわかります。

など。

A - > B - > C

Aが '工場' である場合、B 'はシングルトン' であり、Cが '工場' であり、次いで を解決するシングルトン Bへの参照を取得し、その常に新しいCためには 同じC.

を参照します あなたが解決するたびに作成されますし、Bも 「工場」でなければなりません。

関連する問題