2011-04-26 96 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以簡單的方式批量註冊我的所有處理程序?

回答

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 2011-04-26 15:42:38

+0

我的不好。我試圖在瀏覽器文本框中複製/粘貼和編輯。我編輯了那部分。 – 2011-04-26 15:58:23