2011-01-31 11 views
3

私はそれに依存する他の2つのクラス間でクラスのインスタンスを共有する最良の方法を理解しようとしています。 Castle Windsorの他のクラス間でクラスのインスタンスを共有する

は、私は、これらのクラスを持っていると言う:
class A 
{ 
    public A(B b, C c) {} 
} 

class B 
{ 
    public B(IDFactory factory) {} 
} 

class C 
{ 
    public C(IDFactory factory) {} 
} 

interface IDFactory 
{ 
    D GetD(); 
} 

class D {} 

そしてAのインスタンスごとに

が、私は Dの単一のインスタンスであることを cdで使用 Dをしたいです。私は(工場を使用して言う) Aの新しいインスタンスを作成するときに、私はこれまでのところ、私は理解しました

D.

新しいインスタンスを共有するために cdを望むこと(コンテキストを使用するカスタムライフスタイルを使用して thisクールなライブラリを使用して)最良のアプローチかもしれません。だから私はこのような何かをするだろう:

WindsorContainer container = new WindsorContainer(); 
[.. standard container registration stuff ..] 
container.Register(Component.For<D>().LifeStyle.Custom<ContextualLifestyle>()); 

IAFactory factory = container.Resolve<IAFactory>(); 
using (new ContainerContext(container)) 
{ 
    A a = factory.GetA(); 
} 

今私が持っている問題は、私が工場を使用するポイントでコンテキストを定義する必要があるということです。理想的には、Dが準過渡的で、インスタンスごとに1つのインスタンスがAであるというコンセプトは、すべてのタイプを登録するときにコンテナ内で設定されることが理想です。別の問題は、コンテナ自体のインスタンスがコンテキストに必要であり、3つのコンテナ呼び出しパターンに反することです。

誰でもこの種のものを設定するには、Windsorを使用するか、より優れたアーキテクチャを使用するとよいでしょうか。 Dがクラス階層のかなり深いかもしれないこと、つまりA -> B -> C -> E -> F -> G -> Dと、私はDをツリーの途中まで渡すことを避けたいと考えています。

class A 
{ 
    public A(B b, C c) { } 
} 

class B 
{ 
    public B(D d) { } 
} 

class C 
{ 
    public C(D d) { } 
} 


... 
container.Register(Component.For<D>().LifeStyle.Custom<ContextualLifestyle>()); 
A a = container.Resolve<A>(); 

あなたIAFactoryがcontainer.Resolveを使用して実装されている場合は、代わりのものを使用することができます。

+0

あなたはどこかにリーキーアブストラクションがあると思います。なぜあなたはBとCにIDFactoryを注入していますか?これは、BとCが生存期間中にDの複数のインスタンスを作成することを強く示していますが、その後、常に同じインスタンスを取得できるようにCastleを構成する方法を尋ねます。 BインスタンスとCインスタンスにDインスタンスを単純に挿入する方が理にかなっています。 –

+0

あなたは正しいです、それは私がやりたいことです。どのように私はBとCにDの同じインスタンスを注入するつもりですか? – Geoff

答えて

3

あなたはAのBとCの依存関係の間Dの同じインスタンスを共有したい場合、これは十分なはずです直接の呼び出し。

また、1つの「トップレベル」コンポーネントのみを解決する場合は、コンテキストの明示的な作成を省略できます。

+0

また、コンテキスト作成を省略した依存グラフのトップレベルを解決すると、共有コンポーネントが複数回作成されます。コンテキストを明示的に作成することは避けられないようです。 – Crixo

+0

@Cristiano:あなたは正しいです。それは意図された行動ではありませんでした。私はそれを修正しようとしますが、その間にContextualLifestyleも使用するように最上位コンポーネントを設定することで対処できます(コンテキストを明示的に作成せずにテストしただけです) – gschuager

+0

これは素晴らしいことです。私は私のケースをテストし、それは正常に動作しているようだ:非常に私はグラフルートを抽出するためにGuyWireのアプローチを使用しているので非常に便利です...明示的なコンテキストの作成を設定する必要があります残念です...ありがとう! – Crixo

関連する問題