私はそれに依存する他の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
の単一のインスタンスであることを
c
と
d
で使用
D
をしたいです。私は(工場を使用して言う)
A
の新しいインスタンスを作成するときに、私はこれまでのところ、私は理解しました
D.
の 新しいインスタンスを共有するためにc
と
d
を望むこと(コンテキストを使用するカスタムライフスタイルを使用して
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を使用して実装されている場合は、代わりのものを使用することができます。
あなたはどこかにリーキーアブストラクションがあると思います。なぜあなたはBとCにIDFactoryを注入していますか?これは、BとCが生存期間中にDの複数のインスタンスを作成することを強く示していますが、その後、常に同じインスタンスを取得できるようにCastleを構成する方法を尋ねます。 BインスタンスとCインスタンスにDインスタンスを単純に挿入する方が理にかなっています。 –
あなたは正しいです、それは私がやりたいことです。どのように私はBとCにDの同じインスタンスを注入するつもりですか? – Geoff