2011-04-26 60 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