2015-02-06 5 views
0

사용하여 인수 이름에 따라 다른 종속성을 주입합니다. 그래서 하드 I이 필요합니다 어떻게이 같은 구조를 가지고 윈저

var p = new Processor<T>(new Manager<T>(new XmlProvider()) , new Manager<T>(new MemoryProvider())) 

이 또한 내가이를 관리하는 컨테이너를 구성하는 방법을 알아낼 수 없습니다 사용하여이 열린 제네릭 형식 T.

를 해결해야합니다. 나는 .DependsOn(Property.ForKey("xmlManager").Eq() 지시어가 있다는 것을 알고있다. 하지만 하드 코딩 된 구현을 제외하고는 Eq()에 무엇을 써야하는지 이해할 수 없습니다. 제공자는 자체 종속성을가집니다. 따라서 .Eq(new Manager<T>(new XmlProvide(new OtherInjection(new AnotherOne()))))을 쓰는 것은 영리하지 않습니다. 그리고 오픈 제네릭을 사용할 수 없습니다.

UPD 1 Mr NightOwl888. 논리 정보. 한 공급자는 메모리 캐시에 데이터를 저장하는 것입니다. 두 번째 공급자는 데이터를 XML 파일에 저장하는 데 사용됩니다. 어떤 종류의 2 레벨 캐시 모델. 두 개의 매개 변수를 바꿔도 (Steven이 말한 것처럼) 깨지는 않을 것이지만, 설계된대로 작동하지 않을 것입니다 (정보 검색의 속도가 너무 빠름).

+2

속성 삽입을 사용할 수 있습니다 : http://stackoverflow.com/questions/5030431/castle-windsor-map-named-component-to-specific-property 또는 http://stackoverflow.com/questions/11325699/castle 여기를 참조하십시오. -windsor-how-to-map-named-in-constructor-injection – Ric

+1

우연히 두 매개 변수를 교환하면 어떻게됩니까? 당신의'프로세서'휴식겠습니까? 그렇다면 Liskov Substitution Principle을 위반하고 있으며 설계를 다시 생각해 볼 수 있습니다. – Steven

+2

@ Steven에 동의합니다. 추상화 (인터페이스)의 전체적인 요점은'Processor'가 당신이 다루고있는 구체적인 유형의 IMANager 을 알지 못해 구현을 바꿀 수 있다는 것입니다. 디자인에 따라, '프로세서'는 이러한 세부 사항을 알고 있으며, 나중에 제 3의 'IManager '유형이 도입되면 그것은 '프로세서'에 대한 급격한 변화입니다. 'Processor'는 * IMANager 을 하나 이상 실행해야합니까, 아니면 조건에 따라 * 하나를 선택합니까? '프로세서'는이 논리를 포함시켜 단일 책임 원칙을 위반합니다. 또한 어떤 논리가 설계에서 불분명한지도 모른다. – NightOwl888

답변

0

내가 윈저 작동하지 않았지만, 일반적으로

public class ManagerFactory // register it in container 
{ 
    public IManager<T> Create<T>(IProvider provider) { return ... } 
} 

public class Processor<T> 
{ 
    public Processor(ManagerFactory factory, IEnumerable<IProvider> providers) 
    { 
     myManagers = providers.Select(provider => factory.Create<T>(provider).ToList(); 
    } 
} 

, 당신은 (IProvider에 대한 귀하의 경우) 일부 인터페이스의 많은 구현을 등록 할 수 있습니다와 같은 일반적인 솔루션 보이는, 그래서 용기가 그들에게 모든

를 삽입 할 수
관련 문제