2011-04-12 7 views
0

IOC 프레임 워크 인 StructureMap은 특히 규칙 기반 등록으로 특히 좋습니다. 이제 다음을 시도해 보겠습니다 : 클래스에 기본 (매개 변수 없음) 생성자가있을 때 특정 인터페이스를 구현하는 모든 유형을 추가하고 싶습니다. 그리고 형식은이 생성자를 사용하여 만들어야합니다.구조체 addalltypesof가 특정 생성자에 의해 생성되었습니다.

이것은 올바른 유형을 등록 할 때까지 지금까지 가지고 있지만 인스턴스를 만들 때 기본 생성자를 사용해야한다고 지정하는 방법은 무엇입니까?

public class MyRegistry : Registry  
{ 
    public MyRegistry() 
    { 
     Scan(
      x => 
      { 
       x.AssemblyContainingType<IUseCase>(); 
       x.Exclude(t => !HasDefaultConstructor(t)); 
       x.AddAllTypesOf<IUseCase>(); 
      }); 
    } 
    private static bool HasDefaultConstructor(Type type) 
    { 
     var _constructors = type.GetConstructors(); 
     return _constructors.Any(c => IsDefaultConstructor(c)); 
    } 

    private static bool IsDefaultConstructor(ConstructorInfo constructor) 
    { 
     return !constructor.GetParameters().Any(); 
    } 
} 

답변

1

구조 생성자가 특정 생성자를 사용하도록하는 몇 가지 방법이 있습니다. 가장 간단한 방법은 사용하려는 생성자에 DefaultConstructor 특성을 두는 것입니다. 당신이 원하지 않는다고 가정한다면, 당신은 커스텀 RegistrationConvention를 만들어야 할 것입니다.

public class UseCaseRegistrationConvention : IRegistrationConvention 
{ 
    public void Process(Type type, Registry registry) 
    { 
     if (type.IsAbstract || type.IsInterface || type.IsEnum) 
      return; 

     var useCaseInterface = type.GetInterface("IUseCase"); 
     if (useCaseInterface == null) 
      return; 

     var constructor = type.GetConstructors().FirstOrDefault(c => !c.GetParameters().Any()); 
     if (constructor != null) 
     { 
      registry.For(useCaseInterface).Add(c => constructor.Invoke(new object[0])); 
     } 
    } 
} 

그런 다음 스캔 전화에서 사용 :

Scan(x => 
    { 
     x.AssemblyContainingType<IUseCase>(); 
     x.With(new UseCaseRegistrationConvention()); 
    }); 
관련 문제