2011-01-12 2 views
7

저는 StructureMap을 처음 사용하고 있으며 구조 코드 2.5.4를 사용하는 기존 코드가 일부 있습니다.구조체 맵 및 삽입 IEnumerable <T>

IEnumerable<ICar>을 매개 변수로 사용하는 생성자가있는 StructureMap을 사용하여 생성 된 클래스가 있습니다.

레지스트리에 다음 코드가 있습니다.

Scan(x => 
{ 
    x.TheCallingAssembly(); 
    x.WithDefaultConventions(); 
    x.AddAllTypesOf<ICar>(); 
    } 
); 

ForRequestedType<IEnumerable<ICar>>().TheDefault.Is.ConstructedBy(
      x => ObjectFactory.GetAllInstances<ICar>()); 

는 I는 단위 테스트를 쓰고 및 오프 ObjectFactory를 내포 용기를 얻은 및 분사 방법을 사용하여 인스턴스를 주입했다. ICar의 인스턴스 중 하나가 해당 생성자에서 주입 된 형식을 받아야합니다. 그러나 그것은 작동하지 않았고 내 내포 된 컨테이너를 사용하지 않는 ObjectFactory.GetAllInstances() 호출까지 추적했습니다.

어떻게 작동합니까?

구조 배열 autowiring 배열과 IEnumerable 인스턴스에 대해서도 읽었지만 제대로 작동하지 않습니다.

위의 레지스트리 코드를 다시 작성하여 IEnumerable<ICar>의 인스턴스가 만들어지고 내 중첩 컨테이너의 주입 된 유형을 사용하는 더 좋은 방법이 있습니까?

+0

어떤 장소에서는'TCar'를 사용하고 다른 곳에서는'ICar'를 사용합니다. 그들의 관계는 무엇입니까 (그리고 StructureMap은 그들의 관계에 대해 알고 있습니까)? –

+0

미안하지만, 그들은 똑같은거야. 오타. – GiddyUpHorsey

답변

7

인스턴스를 중첩 된 컨테이너에 삽입하는 경우 해당 인스턴스를 중첩 된 컨테이너에서 검색해야합니다. 정적 인 ObjectFactory에는 자체 컨테이너가 있으며, 케이스에 '부모'컨테이너가있을 수 있습니다. 부모 컨테이너는 중첩 된 컨테이너의 인스턴스를 상속하지 않습니다.

모든 인스턴스를 생성자에 IEnumerable을 허용하는 클래스에 삽입하려면 특정 등록을 수행 할 필요가 없습니다. StructureMap이 자동으로 그렇게 할 것입니다. 컨테이너에 ICar 인스턴스 세 개가 등록되어 있고 해당 컨테이너에서 Foo의 인스턴스를 요청하면 Foo는 IEnumerable<ICar> 생성자 매개 변수를 갖습니다. ICar가 삽입 된 3 개의 인스턴스가있는 Foo가 만들어집니다.

+0

예, 저는 ObjectFactory에 자체 컨테이너가있어 주입 된 유형이'ObjectFactory.GetAllInstances ()'호출에 표시되지 않는다는 것을 알았습니다. 그 코드 행을 다시 작성하여 주입 된 유형이 표시됩니다. – GiddyUpHorsey

+0

'ForRequestedType >() .Default.Is.ConstructedBy (x => ObjectFactory.GetAllInstances ());'줄을 제거하려고했으나 다음과 같은 예외가 발생했습니다 :'StructureMap Exception Code : 202 기본 인스턴스가 정의되지 않았습니다. PluginFamily IEnumerable '에 대해서. 당신이 말했듯이'x.AddAllTypesOf ();'라인은 ICar의 모든 인스턴스를 등록했고 IEnumerable 매개 변수는 요청 된 유형의 생성자에 제공 될 것이라고 생각했습니다. 왜 그게 제대로 작동하지 않는지 아는 사람? – GiddyUpHorsey

+0

좋아, 나는이 일을 얻었다. 최신 버전의 StructureMap을 사용하도록 프로젝트를 업데이트해야했습니다. 버전 2.5.4는 설명대로 작동하지 않지만 2.6.1은 작동합니다. 또한 ForRequestedType >()을 제거하고 중첩 된 컨테이너에서 삽입 된 인스턴스를 가져올 수있었습니다. – GiddyUpHorsey