ウィンザーコンテナ:により処分す。
-
01-07-2019 - |
質問
私はオブジェクトを実装したIDisposableに登録されたウィンザーコンテナから廃棄までの処理手法とも呼ばれ、次回の解決はで分取得し新しいインスタンス.
は
container.Release(obj);
自動的に呼Dispose()す。やらないとい
obj.Dispose();
container.Release(obj);
なものかを正確にスリリースは
編集: 自分の回答は以下の結果を試験を行った.そこで問題となり、どうやって、コンテナリのインスタンスのコンポーネントにシングルトンのライフサイクル?この形態を選択する必要があるで一つの場所をカスタムライフサイクルのようにも重量があるのかのうです。
解決
こんな本当に意識する際にウィンザーコンテナが特に多い 驚き 行動する使い捨ての過渡部品をコンテナによる寿命のカーネルで処分しなければ釈放するよう自分で書-見 こちらの も迅速に見積もり:
のMicroKernelはプラグイン可能な開放政策のできるフック、実施するも ルーティング処理します。のMicroKernelいます。IReleasePolicy実装:
- AllComponentsReleasePolicy:トラックに全ての部品を徹底補正処理のMicroKernelインスタンス処理
- LifecycledComponentsReleasePolicy:みトラック部品として、廃炉のライフサイクル関連
- NoTrackingReleasePolicy:は行いませんの追跡
でも実施する自発政策のインタフェースを用いてIReleasePolicy.
何を感じるかもしれませんがく変更する政策を NoTrackingReleasePolicy その処分を行うことは危険性のあるものが合わない場合には生活習慣に大きく一過性の場合はご容器を廃棄処分申請がありとにかく)はあるんじゃないでしょうかいない。覚えていたる構成にして注入をシングルトン参照を保持でき起こさの問題にしよう"をリフレッシュ"のごsingletonsう悪そうな、かなかできないことがあって初めての改善方法を応用。
その他のアプローチをカスタムライフサイクルでの廃炉実施でのシングルトンが実際に処理コンポーネントでどこに行くにもとっても一過性のライフサイクルな).
また別のアプローチしてデコレータのためのサービスに登録されたコンテナとのシングルトンの生活が、実際の基本サービスに登録されたコンテナとの一過性の生活その時に必要なものをリフレッシュポでの処理の過渡的な裏付け部のデコレータと交換させていただきたてを解決のインスタンス(解決で使用部品のキーというよりも、サービスのためのデコレータ)-この問題を回避とその他のシングルトンサービスになって"リフレッシュ") から保有ュサービスにて処分しておらず、またこれらは未使用できずビットの鋳造など。です。
他のヒント
によって生活のコンポーネントの指定したときに付加します。
ときに使うリリースが発生した場合は、下のライフスタイルが貯.この成分はプールの検索のオブジェクトが破壊されるのではなく、処理すれば)
れば、生活は一過性の新しいオブジェクトの作成ができます。この場合の処理ではございません、ただ呼び出す必要はリリース
場合、ライフスタイルがスレッドが同じ部品を使い各スレッドは破壊されました。
場合、ライフスタイルがシングルトン、そのうちのひとつにしか過ぎではなdetroyed.
れを使用している過渡部品?(困りの場合は処理の適時) その場合、ラップでの利用だけ設定(または電話の処理を自分でどこか)
using(ISomeService service = container.Resolve<ISomeService>())
{
// Do stuff here
// service.Dispose is automatically called
}
編集 -その通りであるため、"リフレッシュ"または廃棄及び再現にシングルトンにする必要があるいずれかを破壊するコンテナやカスタムライフサイクルになっています。というカスタムライフサイクルは実際には、その難しいのが、"ロジカル(論理的)であるようになります。
大丈夫で走ってい試験とのように思い Container.Release()
暗黙的にその原因は、IDisposableの Dispose()
方法を実行する場合にのみ、生活は一過性のことをどのように変動するという正確に正しいものがそもそも太陽系'なぁった場合のライフスタイルがシングルトン).
現在にお問い合わせいただいた場合 Container.Dispose()
での使い捨ての手法も、残念ながらその処理の全体をカーネルへお持ちいただきますのすべての部品によって動くものであり
var container = new WindsorContainer();
container.AddComponentWithLifestyle<MyDisposable>(Castle.Core.LifestyleType.Singleton);
var obj = container.Resolve<MyDisposable>(); // Create a new instance of MyDisposable
obj.DoSomething();
var obj2 = container.Resolve<MyDisposable>(); // Returns the same instance as obj
obj2.DoSomething();
container.Dispose(); // Will call the Disposable method of obj
// Now the components need to be added back in
container.AddComponentWithLifestyle<MyDisposable>(Castle.Core.LifestyleType.Singleton);
var obj3 = container.Resolve<MyDisposable>(); // Create a new instance of MyDisposable
幸いにも私の場合はできるだけ落としすべての部品で復元しも容易だ。しかしこれは最適です。