2010-05-06 2 views
0

"IWordTokensFilter"를 구현하는 두 가지 구체적인 유형 "CategoryFilter"& "StopWordsFilter"가 있습니다.StructureMap 런타임에서 인스턴스를 가져 오는 IOC 문제

ForRequestedType<IWordTokensFilter>().TheDefaultIsConcreteType<CategoryFilter>() 
      .AddInstances(x => 
      { 
       x.OfConcreteType<StopWordsFilter>(); 
      } 
     ); 

문제는 구조지도의 자동 벡, 내 수업에 주입 런타임은 다음과 같습니다

다음은 내 설정입니다. 나는 같은 플러그인 타입과 인수가 :

public ClassA(IWordTokensFilter stopWordsFilter, IWordTokensFilter categoryFilter) 

난 항상 내 첫 번째 인수에 CategoryFilter납니다을하지만 stopWordsFilter해야합니다.

어떻게하면 올바르게 설정할 수 있습니까?

1)를 ClassA는 필터를 구별 할 필요가 있는가, 또는 그냥 둘 다 실행해야 않습니다 사전에 감사

답변

1

가능한 해결 방법은 여러 가지가있을 수 있습니까? 그렇지 않다면, 당신은 IWordTokensFilter의 등록 된 모든 인스턴스가 주입되는 원인이되는 배열을 받아 생성자를 변경할 수 있습니다

public ClassA(IWordTokensFilter[] filters) 

그런 다음 적용 할 필터를 통해 foreach는 할 수 있습니다.

2) 서로 다르게 사용해야하기 때문에 차별화해야 할 필요가있는 경우 마커 인터페이스를 구현하면 해당 용도를 더 잘 설명 할 수 있습니다. 그런 다음 ClassA를 변경하여 IWordTokensFilter 및 ICategoryFilter (또는 마커 인터페이스의 이름을 무엇이든)를 가져올 수 있습니다. ICategoryFilter를 사용하여 CategoryFilter를 등록하면 둘 다 적절히 주입됩니다.

public ClassA(IWordTokensFilter stopWordsFilter, ICategoryFilter categoryFilter) 

3) 당신은를 ClassA를 만드는 방법을 명시 적으로 StructureMap를 알 수 있습니다 :

ForRequestedType<ClassA>().TheDefault.Is.ConstructedBy(c => { 
    return new ClassA(c.GetInstance<StopWordsFilter>(), c.GetInstance<CategoryFilter>()); 
}); 

4)를 ClassA에 대한 종속성 중 하나 오버라이드 (override) StructureMap를 알 수 있습니다 :

x.ForRequestedType<ClassA>().TheDefault.Is.OfConcreteType<ClassA>() 
    .CtorDependency<IWordTokensFilter>("stopWordsFilter").Is<StopWordsFilter>(); 
+0

안녕 여호수아, 나는 당신의 대답에 정말 만족합니다. 나는 해결책 1을 선택하고 싶다 그러나 나는 많은 여과기가있다. 그래서 3이나 4를 사용하기로 결정했습니다. Btw는 솔루션 1의 배열 인수에 모든 구체 유형을 자동 주입합니다. 다시 한번 많은 감사의 말을 전합니다. –

+0

예, 알고있는 모든 구체적인 인스턴스를 자동으로 주입합니다. AddInstances를 사용하여 인스턴스에 대해 명시 적으로 (예에서와 같이) 또는 Scan 내에서 AddAllTypesOf를 호출 할 수 있습니다. –

+0

다시 한 번 감사드립니다. –

관련 문제