2016-12-28 3 views
0
public interface IFoo {} 

public interface IBar {} 

public class Foo1 : IFoo {} 

public class FooOne : IFoo {} 
public class FooTwo : IFoo {} 

public class BarOne : IBar 
{ 
    public BarOne(IFoo foo) {}   
} 

public class BarTwo : IBar 
{ 
    public BarTwo(IFoo foo) {}   
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     UnityContainer container = new UnityContainer(); 
     container.RegisterType<IFoo, FooOne>("One") 
      .RegisterType<IFoo, FooTwo>("Two") 
      .RegisterType<IBar, BarOne>("One") 
      .RegisterType<IFoo, BarTwo>("Two");     

     string fooType = "One"; 
     string barType = "Two"; 

     IFoo myFoo = container.Resolve<IFoo>(fooType); 
     IBar myBar = container.Resolve<IBar>(barType); 
    } 
} 

코드 샘플은 위의이 오류가 발생합니다 : 종속성의Unity에서 명명 된 레지스터 유형을 사용하여 종속성을 해결하는 방법은 무엇입니까?

해결이 실패 유형 = "ConsoleApplication5.IBar"이름 = "2"를. 예외가 발생하는 동안 : 해결하는 중입니다. 예외는 다음과 같습니다. InvalidOperationException - 현재 유형 인 ConsoleApplication5.IFoo가 인터페이스이므로 을 구성 할 수 없습니다. 형식 매핑이 누락 되었습니까? ----------------------------------------------- 예외의 시간, 컨테이너이었다 생성자 ConsoleApplication5.BarTwo (ConsoleApplication5.IFoo foo에)의 파라미터 "foo에" 해결 ConsoleApplication5 해결 ( ConsoleApplication5.IBar 두에서 매핑)

해결 ConsoleApplication5.BarTwo, 두. IFoo, (없음)

내 솔루션이 줄 변경 DependencyResolver 사용

:

IBar myBar = container.Resolve<IBar>(barType); 
를 이에

:

IBar myBar = container.Resolve<IBar>(barType, new DependencyOverride<IFoo>(myFoo)); 

나는 RegisterType 방법을 사용하여이 문제를 해결하려면. 가능하거나 다른 해결책이 있습니까?

감사합니다.

+0

일부 세부 정보가 누락되었습니다. IMessageType을 컨테이너의 코드 어딘가에 등록해야합니다. – Tilak

+0

@Tilak 게시물을 편집합니다. 오류 메시지는 원래 코드에 속합니다. 이제 단순화 된 버전의 오류 메시지를 볼 수 있습니다. –

답변

1

IFoo 이름이이고 IBar를 해결할 때 등록 단위가 사용해야한다고 결정해야합니다.

container.RegisterType<IFoo, FooOne>("One") 
     .RegisterType<IFoo, FooTwo>("Two") 
     .RegisterType<IBar, BarOne>("One", new InjectionConstructor(
            new ResolvedParameter<IFoo>("One"))) 
     .RegisterType<IBar, BarTwo>("Two", new InjectionConstructor(
            new ResolvedParameter<IFoo>("Two"))); 

문제는 IFoo 두 번 다른 구현에 의해 등록되고 화합 유형을 해결할 때 사용해야하는 일을 알고하지 않습니다.

+0

네가 맞다.하지만이 예에서는 이전에 이름이 등록 된 "하나"로 IFoo를 해결합니다. 나중에 IFoo를 해결해야 할 때마다 Unity가 동일한 등록을 계속 사용하도록하고 싶습니다. 그게 가능하지 않거나 어떤 점을 놓치고 있습니까? –

+0

IFoo "One"은 생성자에 종속성이 없기 때문에 해결됩니다. 그래서 Unity는 해결할 문제가 없습니다. 문제는 IBar 등록입니다. 나는 당신이 "같은 등록을 사용함"이란 뜻을 얻지 못합니다. 당신의 이름으로 IFoo를 해결할 때 아무런 문제가 없지만, IBar는 두 번 등록되며 두 번 등록 된 IFoo에 의존합니다. Unity가 등록 된 IFoo 중 어느 것을 사용해야하는지 등록해야합니다. – Mark

+0

@Mehmet Kemal Bayer이 항상 같은 'IFoo'를 해결하고 싶다면 왜 등록을해야합니까? – Johnny

관련 문제