2017-04-04 10 views
0

連鎖した依存関係のパラメータを上書きする必要があります。私のオーバーライドされたパラメータは、第1および第2のインスタンス化されたクラスに渡されなければなりません。オーバーライドされたパラメータを使ったUnity連鎖依存関係

私のクライアントクラスは、envというパラメータ(起動時にはわかりません)を持つIAのインスタンスが必要です。そして、IAのコンストラクタは、同じカスタムのenvパラメータを持つIBのインスタンスを必要とします。ここ

class A : IA 
{ 
    IB _b; 
    AppEnv _env; 

    public A(IB b, AppEnv env) 
    { 
     _b = b; 
     _env = env; 
    } 

    void DoStuff(); 
} 

class B : IB 
{ 
    AppEnv _env; 

    public A(AppEnv env) 
    { 
     _env = env; 
    } 

    void DoStuff(); 
} 

そして、私のクライアントのコードは次のとおりです:だからここ

は私の二つのクラスのコードです

var env = new... // "good" env, with runtime values 
var a = container.Resolve<IA>(new ParameterOverride("env", env)); 

IAのインスタンスが「良い」envパラメータを持っています。しかし、このパラメータをIBのインスタンスに渡すにはどうすればよいですか?

マイUnityコンフィギュレーションは、次のようになります。あなたは、継承を変更したくない場合は

var defaultEnv = new ... // default env object 
container.RegisterType<IB, B>(new InjectionConstructor(defaultEnv)); 
container.RegisterType<IA, A>(new InjectionConstructor(defaultEnv)); 
+0

私はAppEnvをUnityでオーバーライドする代わりに継承するBaseクラスを提案します。 – JoshYates1980

+0

'b'をコード内で取得しているのと同じ方法で取得してから、両方のパラメータを上書きするだけでいいのですか?私は統一を使用していないが、ちょうどそれがうまくいくように見えるコードを見てから... – Chris

答えて

2

が、私はあなたがユニティでInjectionConstructorのための静的な解像度を使用はずのだと思います。スタートアップ登録することができます早い行うことができ、私が書いたもので

// At "Startup" 
container.RegisterType<IA, A>(
    new InjectionConstructor(
     new ResolvedParameter<AppEnv>("JustANameIfYouHaveMany"))); 

container.RegisterType<IB, B>(
    new InjectionConstructor(
     new ResolvedParameter<AppEnv>("JustANameIfYouHaveMany"))); 

// Whenever you can get the proper value of AppEnv 
AppEnv correctValue = AppEnv.WhateverLogic(); 
container.RegisterInstance<AppEnv>("JustANameIfYouHaveMany", correctValue); 

を、しかし限り、あなたはあなたcontainer.Resolve<IA or IB>()前に、登録の第二部がそうであるように、それは解決罰金を起こっている:私はResolvedParameterでいいよ。

関連する問題