StructureMap을 사용하여 유형별로 내부 의존성을 설정합니다

StackOverflow https://stackoverflow.com/questions/1628382

  •  06-07-2019
  •  | 
  •  

문제

머리를 긁는 구조 구성 구성이 있습니다. 인터페이스 검증 클래스가 필요한 인터페이스 UI 요소가 필요한 구체적인 클래스가 있습니다. 외부 콘크리트 클래스가 기본 UI 요소를 얻기를 원하지만 콘크리트 클래스 특정 검증 객체를 얻으십시오. 이 같은:

class MyView 
{
   IPrompt prompt
}

class GenericPrompt : IPrompt
{
   IValidator validator
}

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

MyView의 종속성을 생성 할 때 MyValidator 만 사용하도록 Registry DSL을 사용하여 StructureMap을 구성하려면 어떻게해야합니까? (그리고 bobsview의 종속성을 생성 할 때 Bobsvalidator를 사용하여 가정)

도움이 되었습니까?

해결책

컨테이너에서 myview (및 bobsview)를 받고 있습니까? 그들이 모두 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);
    }
}

이제 IPROMPT가 항상 명명 컨벤션에 따른 견해에 의해 항상 요청 될 것이라고 가정하면 등록 소는 다음과 같이 보일 수 있습니다.

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>();
        });
    }
}

적절한 유효성 검사기로보기를 검색하려면 콘크리트 유형을 요청해야합니다.

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

"root.requestedType"에 따라 다르기 때문에 컨테이너 (서비스 위치)로 직접 호출하여보기를 검색하는 경우에만 작동합니다. 견해를 얻으려는 방법에 따라보기를 찾기 위해 빌드 스택을 걸을 수 있습니다 (항상 루트라고 가정하는 대신).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top