2010-04-12 2 views
2

이 같은 인터페이스 뭔가를 특정 클래스 나는 다음과 같은 특정 구현을 가지고 :StructureMap - - 스캔 기본 구현 및 특정와 일반 인터페이스

class ContractSetupViewModel : GenericSetupViewModel<Contract> 

이제 내가 원하는 내가 무엇을 요청할 때 ContractSetupViewModel은 반환받을 싶은

ObjectFactory.GetInstance<GenericSetupViewModel<Contract>(); 

을 요청할 때 StructureMap이 올바른 인스턴스를 반환 만든다, 난 내가 시도

GenericSetupViewModel<T> 

의 인스턴스를 좀하고 싶습니다 이 일을 :

 StructureMap.ObjectFactory.Configure(x => 
     { 
      x.Scan(y => 
      { 
       y.TheCallingAssembly(); 
       y.AddAllTypesOf(typeof(IGenericSetupViewModel<>)); 
       y.ConnectImplementationsToTypesClosing(typeof(IGenericSetupViewModel<>)); 
      }); 
     }); 

은 그러나이 나를 항상 GenericSetupViewModel과 결코 ContractSetupViewModel를 받고 결과. 나는 모든 특정 viewmodels를 지정해야하고 싶지 않으므로 어쨌든 나는이 검사가 작동하도록 할 수 있습니까? 당신의 GetInstance 방법에서

+0

'IGenericSetupViewModel '을 요청하면 어떻게 됐나요? – flq

+0

내가 GenericSetupViewModel을 묻는 것과 똑같은 것

답변

3

특정 폐쇄 형 직접 인터페이스를 구현하지 않은 경우 ConnectImplementationToTypesClosing 문제가 있었다 StructureMap에서 수명이 짧은 버그가 발생했습니다. 당신이 StructureMap의 최신 버전을 다운로드하면 , 다음 코드는 작동합니다

StructureMap.ObjectFactory.Configure(x => 
{ 
    x.Scan(y => 
    { 
     y.TheCallingAssembly(); 
     y.ConnectImplementationsToTypesClosing(typeof(IGenericSetupViewModel<>)); 
    }); 
    x.For(typeof (IGenericSetupViewModel<>)).Use(typeof(GenericSetupViewModel<>)); 
}); 
+0

업데이트를 시도했지만 여전히 작동하지 않습니다. 아래 코드는 여전히 ContractViewModel 대신 GenericSetupViewModel 을 제공하여 표시된 결과가 아무 것도 해석하지 못하는 것으로 설명합니다. StructureMap.ObjectFactory.Configure (x => { x.검사 (y => { y.TheCallingAssembly(); y.ConnectImplementationsToTypesClosing (typeof (IGenericSetupViewModel <>)); }); (typeof (GenericSetupViewModel <>)); }}); 최신 structuremap에 전달하는 다음 시험에서 –

+1

봐, : 이 http://github.com/structuremap/structuremap/blob/61c4b9b6d968b6bcce0e63fed5079902d0ab956e/Source/StructureMap.Testing/Bugs/CloseOpenGenericsWithSomeSpecifics.cs 는 당신이 테스트가 실패 할 수 ? 귀하의 모범과 어떻게 다른가요? 표시되지 않고 잠재적으로 상충 될 수있는 추가 등록 코드가 있습니까? –

+0

스캐너가 공개 되야 만 스캐너가 작동하기 때문에 문제가 발견되었습니다. 감사합니다. –

0

당신이 그런 짓을해야합니다

if (AnInstance is GenericSetupViewModel) 
    return AnInstance as GenericSetupViewModel; 
else if (AnInstance is ContractSetupViewModel) 
    return AnInstance as ContractSetupViewModel; 
+0

정확히 내가하고 싶지 않은 것. –

+0

그것은 당신이하고 싶은 것이 아닐지도 모르지만 다른 어떤 방법도 (내 머리 꼭대기에서) 볼 수는 없습니다. 이것이 작동하지 않는다면 아마도 디자인을 재고해야합니다. – James

0

내가 StructureMap 너무 익숙하지 않아요하지만 당신이 등록 우선 순위의 속임수 것을 될 수 있을까?

먼저 y.AddAllTypesOf(typeof(IGenericSetupViewModel<>));으로 전화 했으므로 먼저 opene 제네릭 클래스 GenericSetupViewModel<T>이 등록됩니다. 이 등록은 GenericSetupViewModel<Contract>에 대한 귀하의 해결 요청을 이행하며보다 구체적인 ContractSetupViewModel 등록은 무시됩니다.

즉, the Flattener sample은 개방형 제네릭 형식 등록 및 특정 폐쇄 형 제네릭 형식 등록이 작동해야 함을 분명히 보여줍니다. 이 패턴을 당신의 타입과 함께 사용할 수 있습니까?