2017-01-17 5 views
0

의 컬렉션 주사 (그리고 대답했다) : 내 레지스트리에서 Structure Map - Collection of Dependencies in Constructor구조지도 -이 질문은 내가 이전에 요구했다 질문과 매우 유사 명명 된 인스턴스

을 나는 다음과 같습니다

For<IMyObject>().Add<MyObjectType1>().Named("Type1"); 
For<IMyObject>().Add<MyObjectType2>().Named("Type2"); 
For<IMyObject>().Add<MyObjectType3>().Named("Type3"); 

I 모든 인스턴스를 생성자에 삽입하여 모든 명명 된 인스턴스를 검색 할 수 있습니다. 예제 코드 (StructureMap 예외를 생성) :이 방법에 대한

public class Example 
{ 
    private Dictionary<string, IMyObject> _workers; 

    public Example(Dictionary<string, IMyObject> workers) 
    { 
    _workers = workers; 
    } 

    public void DoSomeStuff(string mode) 
    { 
    var worker = _workers[mode]; 
    worker.DoStuff(); 
    } 
} 

내 이유는 뭔가 (위의 예 '모드'로 명명 된 인스턴스에 해당하는 것) 처리 방법을 지정하는 외부 구성을 허용하는 것입니다. 다음과 같이

실제 예외입니다 :

StructureMap.StructureMapException occurred 
    ErrorCode=202 
    HResult=-2146232832 
    Message=StructureMap Exception Code: 202 
No Default Instance defined for PluginFamily 

내가 명명 된 인스턴스를 검색하기 위해 내 방법 DoSomeStuff에 StructureMap 컨테이너를 사용할 수 있다는 것을 알고있다, 그러나,이 안티 패턴의 뭔가 .

  • 은 내가 그들의 이름을 참조 할 수 있도록, 명명 된 인스턴스의 사전 (또는 다른 모음)를 주입 할 수 :

    그래서 제 질문을 명확히?

더 자세한 설명이 필요하면 다시 말해주세요.

  • C 번호 : 4.0
  • StructureMap : 2.5.4.0

감사합니다,

그램

답변

2

대신 사전을 주입, 대신 Func<string, IMyObject>를 주입하는 것이 더있을 수 있습니다.

For<Example>() 
    .Use(() => new Example(mode => container.GetInstance<IMyObject>(instanceKey: mode))); 
+0

감사 @Steven을 다음과 같이

public class Example { private Func<string, IMyObject> _workers; public Example(Func<string, IMyObject> workers) { _workers = workers; } public void DoSomeStuff(string mode) => _workers(mode).DoStuff(); } 

당신은 당신의 Example을 등록 할 수 있습니다 : 그 중 하나가 정말 사용할 필요하면서 모든 종속성 모든 IMyObject 인스턴스를 생성 할 필요가 StructureMap을 방지 응답하는 데 시간이 걸렸습니다. Example의 단일 인스턴스는 반복 호출을 통해 어느 시점에서 IMyObject의 모든 인스턴스를 사용합니다. 예제 클래스는 주로 IMyObject의 올바른 구현을 지시하는 책임이 있습니다. 나는 예제 calss가 요청을 받았을 때 레지스트리에서 사전을 '새로 만들 수있다'는 것을 알고 있지만 더 우아한 해결책이 있기를 바란다. – GinjaNinja

+0

@GinjaNinja : 나는 가장 우아한 솔루션을 발견했다. 왜이 솔루션이 당신을 위해 작동하지 않습니까? – Steven

+0

사과, 나는 거기에서 표식에서 조금 빠를지도 모른다. 당신의 해결책은 나를 위해 일하고 나는 대답을 받아 들일 것입니다. 예제 클래스의 추가 '연결'없이 모든 종류의 컬렉션을 제공하기 위해 빌드 된 방법이 있었으면합니다. 한 가지 질문으로 IMyObject의 각 구현에 대해 하나의 객체 만 생성되도록하는 방법을 알고 있습니까? – GinjaNinja