Autofac: Пакетная регистрация открытых универсальных типов - PullRequest
14 голосов
/ 26 апреля 2011

Я получил сборку со многими конкретными типами, которые реализуют IHandler<TCommand>, например:

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?

Ответы [ 2 ]

26 голосов
/ 27 апреля 2011

В стиле, аналогичном ответу Джима, но с использованием AsClosedTypesOf:

Assembly[] assemblies = GetYourAssemblies();

builder.RegisterAssemblyTypes(assemblies)
    .AsClosedTypesOf(typeof(IHandler<>));
3 голосов
/ 26 апреля 2011

Возможно, вы хотите что-то подобное, хотя я не уверен, как IsAssignable () ведет себя с открытыми обобщениями.

Assembly[] assemblies = GetYourAssemblies();

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