2011-04-26 6 views
12

나는 다음과 같은 IHandler<TCommand>을 구현하는 여러 구체적인 종류와 어셈블리를 가지고 일괄 등록 : 다음과 같이 현재Autofac : 열려있는 일반적인 유형

public class MoveCustomerHandler : IHandler<MoveCustomerCommand> 
{ 
    void IHandler<MoveCustomerCommand>.Handle(MoveCustomerCommand c) 
    { 
     // some business logic for moving a customer. 
    } 
} 

, 나는 하나씩 등록 해요 :

builder.RegisterType<MoveCustomerHandler>() 
    .As<IHandler<MoveCustomerCommand>>(); 

builder.RegisterType<ProcessOrderHandler>() 
    .As<IHandler<ProcessOrderCommand>>(); 

builder.RegisterType<SomeOtherFancyHandler>() 
    .As<IHandler<SomeOtherFancyCommand>>(); 

// Many handler registrations here... 

아래 알 수있는 바와 같이, 명령어 핸들러는, 생성자 주입을 사용하여 주입된다

public class OrderController 
{ 
    private readonly IHandler<ProcessOrderCommand> handler; 

    public OrderController(IHandler<ProcessOrderCommand> handler) 
    { 
     this.handler = handler; 
    } 
} 

Autofac을 사용하여 손쉽게 모든 Handler를 배치 등록 할 수 있습니까?

답변

22

하지만 AsClosedTypesOf을 활용 :

Assembly[] assemblies = GetYourAssemblies(); 

builder.RegisterAssemblyTypes(assemblies) 
    .AsClosedTypesOf(typeof(IHandler<>)); 
3

IsAssignable()이 어떻게 오픈 제네릭과 동작하는지 잘 모르겠지만 아마 다음과 같은 것을 원할 것입니다.

짐의 대답에 비슷한 스타일에서
Assembly[] assemblies = GetYourAssemblies(); 

builder.RegisterAssemblyTypes(assemblies) 
    .Where(t => t.IsAssignableFrom(typeof(IHandler<>))) 
    .AsSelf() 
    .AsImplementedInterfaces(); 
+0

덕분에 당신의 응답을. 나는 당신이 여기에서 성취하려고하는 것을 확신하지 못한다. 'Type.GetCustomAttributes()'메쏘드는'object []'를 반환합니다. 어떻게 그렇게 도움이됩니까? – Steven

+0

제 잘못입니다. 브라우저 텍스트 상자에 복사/붙여 넣기 및 편집을 시도했습니다. 나는 그 부분을 편집했다. –