15

I got an assembly with many concrete types that implement IHandler<TCommand>, such as the following:

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

Currently, I'm registering them one by one as follows:

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

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

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

// Many handler registrations here...

The command handlers are injected using constructor injection, as can be seen below:

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

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

Is there a way to batch register all my handlers in an easy way using Autofac?

Steven
  • 166,672
  • 24
  • 332
  • 435

2 Answers2

30

In a similar style to Jim's answer but taking advantage of AsClosedTypesOf:

Assembly[] assemblies = GetYourAssemblies();

builder.RegisterAssemblyTypes(assemblies)
    .AsClosedTypesOf(typeof(IHandler<>));
Nicholas Blumhardt
  • 30,271
  • 4
  • 90
  • 101
3

You probably want something like this, although I'm not sure how IsAssignable() behaves with open generics.

Assembly[] assemblies = GetYourAssemblies();

builder.RegisterAssemblyTypes(assemblies)
    .Where(t => t.IsAssignableFrom(typeof(IHandler<>)))
    .AsSelf()
    .AsImplementedInterfaces();
Jim Bolla
  • 8,265
  • 36
  • 54
  • Thanks for your response. I'm not sure what you try to accomplish here. The `Type.GetCustomAttributes()` method returns an `object[]`, so how is that going to help me? – Steven Apr 26 '11 at 15:42
  • My bad. I tried to copy/paste and edit in the browser text box. I edited out that part. – Jim Bolla Apr 26 '11 at 15:58