私は昨日この質問をしようとしたが、意味をなさない。だから私は自分の問題を示すために複製物を作りました。カスケード依存関係を登録する(Take 2)
私が解決している次のプログラムでは、バーの魔女にFooとFoolを注入する必要があります。 FoolはFooにも注入されています。キャッチは、BarとFoolの両方が同じFooを使用したいと思っています。次のコードでは起こっていません。
私は、型を解決して、メインメソッドで特定の注入コンストラクタを定義できますが、私は複雑です。この場合、BlatとBarを作成します。キャッチとは、BlatとBarが異なるFooを使用したいということです。
は考えてみましょう:
static void Main(string[] args)
{
IUnityContainer container = new UnityContainer();
var foo = container.Resolve<Foo>();
container.RegisterType<Fool>(new InjectionConstructor(foo));
var fool = container.Resolve<Fool>();
container.RegisterType<Bar>(new InjectionConstructor(foo, fool));
container.RegisterType<Blat>(new InjectionConstructor(foo, fool));
Console.WriteLine("Resolving Bar");
container.Resolve<Bar>();
container.Resolve<Blat>();
Console.ReadLine();
}
}
この場合Bar.Foo == Bar.Fool.FooしかしBlat.Foo == Bar.Fooで。つまり、私が欲しい Bar.Foo == Bar.Fool.Foo & & Blat.Foo!=
これを実行する方法はありBar.Foo
?私はこの問題は、現実の世界にある問題をさらに混乱させるEDITTED ...私はなど各バー、BLAT、の子コンテナを作成しないようにしたいと思います
をバーのとBLATの多くの種類を解決します私は次のようなものを持っています:
BaseViewModel(Context context, ServiceA a, ServiceB b)
各コントロールには、異なるコンテキストを使用して作成されたViewModelが必要です。各viewModelでは、サービスは同じコンテキストを使用する必要があります。ですから、私はUnityにコンテキスト、a、bをすべて同じコンテキストを使って作って欲しいと思います。
私はあなたの提案に似た何かをすることができます。私は、BaseViewModelのコンストラクタでサービスのコンテキストプロパティを設定することができますが、それは私にとって奇妙に思えます。今はコンストラクタのサービスを新しくしていますが、私はむしろUnityを使ってそれを行うので、結構緊密に結合されていません。私はよりエレガントな方法があることを望んでいた。 Bar.Foo
がBar.Fool.Foo
のためのちょうど便利セッター/ゲッターである
public class Bar
{
public Bar(Fool fool)
{
this.Fool = fool;
}
public Foo Foo
{
get { return this.Fool.Foo; }
set { this.Fool.Foo = value; }
}
public Fool Fool { get; set; }
}
:
同じインスタンスを2回注入する理由については、私の編集を参照してください – foo