2012-02-23 6 views
1

私は昨日この質問をしようとしたが、意味をなさない。だから私は自分の問題を示すために複製物を作りました。カスケード依存関係を登録する(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.FooBar.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

、すなわち、PerResolveLifetimeManagerFooを登録する:あなたはBarを解決するとき

static void Main(string[] args) 
{ 
    IUnityContainer container = new UnityContainer(); 
    container.RegisterType<Foo>(new PerResolveLifetimeManager()); 

    Console.WriteLine("Resolving Bar"); 
    container.Resolve<Bar>(); 
    container.Resolve<Blat>(); 
    Console.ReadLine(); 
} 

Fooの同じインスタンスがBarに注入し、Foolに注入されます。

Blatを解決すると、Fooという新しいインスタンスがBlatFoolに挿入されます。

従ってBar.Foo == Bar.Fool.FooおよびBlat.Foo == Blat.Fool.Fooしかし、Bar.Foo != Blat.FooおよびBar.Fool.Foo != Blat.Fool.Foo

container.Resolveを呼び出すたびに、そのグラフに対してFooという1つのインスタンスしか解決されません。これはPerResolveLifetimeManagerです。

0

はあなたが考えられ、このような何かをお持ちですか?なぜ同じインスタンスを2回注入するのですか?あなたのIUnityContainer

+0

同じインスタンスを2回注入する理由については、私の編集を参照してください – foo

関連する問題