2011-01-03 15 views
0

編集:私はここで本当に愚かな何かをしなければなりません城ウィンザー解放コンポーネント

 var container = new WindsorContainer(); 

     container.Register(Component.For<IFoo>().ImplementedBy<Foo>().LifeStyle.Singleton); 
     var foo = container.Resolve<IFoo>(); 
     container.Kernel.ReleaseComponent(foo); 
     var foo2 = container.Resolve<IFoo>(); 

     Assert.IsTrue(foo != foo2) // this fails 

public interface IFoo : IDisposable { } 

public class Foo : IFoo { 
    public void Dispose() 
    { 

    } 
} 

私が完成しましたが、私は次のようにまで私の問題を簡素化することができましたとして、質問を言い換え...どんな考え?

基本的に、私がここで達成しようとしているのは、コンポーネントのすべての解像度が一定期間(スコープ)同じインスタンスを返すことです。これを達成するより良い方法があれば、私は確かにそれに開いています。

編集: これはRTFMです。明らかにこれは設計によるものです。私はここにカスタムライフスタイルマネージャーを欲しいものを達成する最善の方法ですか?

ありがとうございました。

+1

はい、それはあなたがしたい行動なら、カスタムライフスタイルは –

+0

ありがとうございます。これを行うためにAbstractLifestyleManagerから継承したカスタムクラスを追加しましたが、ReleaseComponentを呼び出すとReleaseは呼び出されません。カーネルのReleasePolicy.HasTrackがtrueを返す場合、Releaseは呼び出されるように見えますが、それはすべてのコンポーネントで起こっていません...アドバイスできますか?ありがとう。 – Jeff

答えて

3

FooPerThreadです。つまり、別のスレッドでリクエストすると、新しいインスタンスを取得します。私があなたを正しく理解していれば、問題はあなたが選んだライフスタイルであり、コンポーネントのリリース方法ではありません。

+0

申し訳ありませんが、私は明確に説明していなかったと思います。それがシングルトンの場合、私はまだ同じ問題を抱えています。問題は、MyTypeに注入されたFunc が内部的に "Resolved Instances"のリストを保持していて、Funcを呼び出すたびにcontainer.Resolveを内部的に呼び出さないということです。したがって、私は1. Funcを呼び出して、インスタンスを戻します。 2.スレッド上の他の人、またはSingletonの場合はどこでも、そのインスタンスで.Disposeを呼び出します。 3.インスタンスはコンテナから削除されますが、その後同じFunc を呼び出すと、新しいインスタンスの代わりに破棄されたインスタンスが返されます。 – Jeff

+0

追加された例。助けてくれてありがとう。 – Jeff

関連する問題