私は、これは広告nauseum議論されている知っている...しかし、私はウィンザーが一時IDisposableをオブジェクトを追跡している方法で問題が発生しました。城ウィンザー過渡使い捨て
私はウィンザーは私IDiposablesを管理させることの利点を理解し...しかし、私はそれを好きではありません。
私が使用してブロック内の私のコンポーネントをラップしたい場合はどうなりますか?コーダーは、リソースが使用ブロックの最後でクリーンアップされるという仮定を立てます。間違った - Disposeが呼び出されますが、Windsorは明示的に解放されるまでインスタンスを保持します。これは私が何をやっているか知っているので、私にとってはうまくやっています...しかし、クラスをコーディングし、IDisposableを他のIDisposableが通常使用されるように使用する別の開発者はどうですか?
using(factory.CreateInstance())
{
....
}
よりも、私にはより明確になります。本当に私のインスタンスを配置し、GCのためにそれらを対象と持つために
MyDisposable instance;
try
{
instance = factory.GetInstance();
}
finally
{
factory.Release(instance);
}
、私はWindsorContainerを参照するか、リリースを公開して、型指定されたファクトリを使用する必要があります方法。つまり、IDisposableコンポーネントを使用する唯一の許容される方法は、型付きのファクトリを使用することです。私の意見では、これは良いことではありません。誰かが既存のコンポーネントにIDisposableインターフェイスを追加するとどうなりますか? コンポーネントを注入することを期待するすべての場所を変更する必要があります。それは私の意見では本当に悪いです。 (非DIシナリオでは、Disposeも呼び出すように変更する必要がありますが、ウィンザーでは、すべての場所で型付きのファクトリを使用するように変更する必要があります。これはずっと大きな変更です)。
[OK]を、十分に公正、私はカスタムReleasePolicy権を使用することができますか?これはどう?
public class CustomComponentsReleasePolicy : AllComponentsReleasePolicy
{
public override void Track(object instance, Burden burden)
{
if (burden.Model.LifestyleType == LifestyleType.Pooled)
base.Track(instance, burden);
}
}
いいえ、私のIDisposable Transientコンポーネントは現在GCになります。
私は私のクラスは、タイプの多くのインスタンスを生成することができますので、TypedFactoryを使用したい場合は?
public interface IMyFactory
{
MyDisposable GetInstance();
void Release(MyDisposable instance);
}
[Singleton]
public class TestClass
{
public TestClass(IMyFactory factory) { }
}
[OK]をMyDisposableが追跡されていないので、まあ、1のために、工場出荷時にリリースを呼び出すと、MyDisposable上)廃棄する(呼び出すために何もしません....
どのように私は、これらの困難を克服することができますか?
ありがとうございました。
私はこの –
についてのブログにする必要がありますだと思いますありがとう。私はそれを読むよ:) – Jeff