2017-02-07 1 views
1

Unity에서 등록을 설정하려고하는데 필요한 정보를 얻는데 어려움이 있습니다.인스턴스를 요청하는 클래스를 기반으로하는 Unity 해결

나는 다음과 같은 정의를 상상해 다음과 같이

public interface ISomeInterface { ... } 

public interface ISomeDependency { ... } 

public class DependencyA : ISomeDependency { ... } 

public class DependencyB : ISomeDependency { ... } 

public class SomeClassA : ISomeInterface 
{ 
    public SomeClassA(ISomeDependency dep){ ... } 
} 

public class SomeClassB : ISomeInterface 
{ 
    public SomeClassB(ISomeDependency dep){ ... } 
} 

내가 다음 유니티로 등록 :

Container.RegisterType<ISomeDependency, DependencyA>("DependencyA"); 
Container.RegisterType<ISomeDependency, DependencyB>("DependencyB"); 
Container.RegisterType<ISomeInterface, SomeClassA>("ClassA"); 
Container.RegisterType<ISomeInterface, SomeClassB>("ClassB"); 

나는 또한 ISomeInterface 기반으로 키를 구축하는 공장을 등록합니다.

Container.RegisterType<Func<string, ISomeInterface>(new InjectionFactory(c=> 
{ 
    return new Func<string, ISomeInterface>(x=> 
    { 
     return c.Resolve<ISomeInterface>(x) 
    } 
})); 

(사람이 키가 공장을 만드는 더 좋은 방법을 알고 있다면 덧붙여 말하자면, 나는 환영하려는 팁)

가 어떻게 단결을 구성 할 수 있습니다 유니티 나에게 SomeClassA의 인스턴스를 구축 할 때, 그것은 또한 것 같은 DependencyA 인스턴스를 삽입 하시겠습니까? Unity가 SomeClassB의 인스턴스를 빌드 할 때와 마찬가지로 DependencyB 인스턴스를 삽입합니다.

감사합니다.

편집 : 당신이 하나의 인터페이스에 대한 두 가지 구체적인 유형을 등록하면, 유니티를 해결하기 위해 어느 알 수 없습니다 내 오타

+0

동일한 개체 그래프에서 동일한 인터페이스의 여러 구현을 시작하면 [Pure DI] (http://blog.ploeh.dk/2014/06/10/pure-di/)가 더 나은 옵션이됩니다. 자세한 내용은이 기사를 참조하십시오. http://criticalsoftwareblog.com/index.php/2015/08/23/why-di-containers-fail-with-complex-object-graphs/ –

+0

공장 추상화 사용 (비록'Func '을 사용한다고해도) 일반적으로 [디자인 냄새] (https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=100)입니다. – Steven

답변

1

수정. 더 많은 정보를 제공해야합니다. 이를 수행하는 한 가지 방법은 매개 변수 대체를 사용하는 것입니다.

// Override the constructor parameter "dep" value 
// Use DependencyA instead of other value 
var result = container.Resolve<ISomeInterface>(
    new ParameterOverride("dep", new DependencyA()) 
     .OnType<SomeClassA>()); 

당신은 또한 당신이 ISomeInterface을 할 때 유니티 당신이 원하는 그 구현 중 하나를 이야기해야합니다, 그래서, 당신은 또한, ISomeInteface의 유형으로 봇 SomeClassASomeClassB 등록했습니다.

관련 문제