2009-10-27 2 views
0

내 머리를 긁적 거리는 구조 맵 구성이 있습니다. 나는 인터페이스 클래스를 필요로하는 인터페이스 요소를 필요로하는 구체적인 클래스를 가지고있다. 외부 concrete 클래스에서 기본 UI 요소를 가져오고 구체적인 클래스 별 유효성 검사 객체를 가져 오려고합니다. 이런 식으로 뭔가 :구조 맵을 사용하여 유형별 내부 종속성 설정

class MyView 
{ 
    IPrompt prompt 
} 

class GenericPrompt : IPrompt 
{ 
    IValidator validator 
} 

class MyValidator : IValidator 
{ 
    bool Validate() {} 
} 

어떻게 MYVIEW에 대한 종속성을 만들 경우에만 MyValidator을 사용하여 레지스트리 DSL과 structuremap을 구성 할 수 있습니다. (BobsView에 대한 종속성을 생성 할 때 BobsValidator를 사용하는 것으로 가정 함)

+0

BobsView도 IPrompt에 종속됩니까? 그렇지 않으면 문제가 없습니다. 그렇다면 프로필을 살펴 보는 것이 좋습니다. – KevM

답변

1

컨테이너에서 MyView (및 BobsView)를 가져오고 있습니까? 우리는 그들이 모두 IPrompt의 사례를 취할 것이라고 가정 할 수 있습니까?

한 가지 방법은 모든 유효성 검사기를보기 이름과 일치하는 이름으로 등록하는 것입니다.

: 당신이 IPrompt 항상 명명 규칙, 레지스트리의 모습 수 다음 뷰에 의해 요구 될 것입니다 가정하면, 이제

public class ValidatorScanner : ITypeScanner 
{ 
    public void Process(Type type, PluginGraph graph) 
    { 
     if (!typeof (IValidator).IsAssignableFrom(type)) return; 
     var validatorName = type.Name.Replace("Validator", ""); 
     graph.AddType(typeof(IValidator), type, validatorName); 
    } 
} 

: 당신은 단지 검사기 접미사를 제거 자신의 형 스캐너를 구현할 수 당신이 retri 경우

var view = container.GetInstance<MyView>(); 

이 만 작동합니다 :
public class ValidatorRegistry : Registry 
{ 
    public ValidatorRegistry() 
    { 
     Scan(scan => 
     { 
      scan.TheCallingAssembly(); 
      scan.With<ValidatorScanner>(); 
     }); 

     ForRequestedType<IPrompt>().TheDefault.Is.ConstructedBy(ctx => 
     { 
      var viewName = ctx.Root.RequestedType.Name.Replace("View", ""); 
      ctx.RegisterDefault(typeof(IValidator), ctx.GetInstance<IValidator>(viewName)); 
      return ctx.GetInstance<GenericPrompt>(); 
     }); 
    } 
} 

적절한 검증과보기를 검색하려면 구체적인 유형을 요청해야 "Root.RequestedType"에 의존하기 때문에 컨테이너 (서비스 위치)에 대한 직접 호출을 사용하여 뷰를 전달합니다. 뷰를 얻는 방법에 따라 뷰를 찾는 BuildStack을 걸어 갈 수 있습니다 (항상 루트라고 가정하는 대신).

+0

감사합니다. 그게 내가 필요로하는 것만 얻었습니다. ctx에서 인텔리 센스가 작동하지 않는 이유는 무엇입니까? – JoshRivers