2017-04-04 2 views
0

연결된 종속성의 매개 변수를 재정의해야합니다. 재정의 된 매개 변수는 첫 번째 및 두 번째 인스턴스화 된 클래스에 전달되어야합니다.오버라이드 된 매개 변수가있는 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의 인스턴스에 전달하려면 어떻게해야합니까?

내 유니티 구성은 다음과 같이 : 상속을 변경하지 않으려면

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

Unity로 대체하는 대신 AppEnv를 상속하는 기본 클래스를 제안합니다. – 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에 가고 싶어 .

관련 문제