2016-03-02 3 views
1

У меня возникли проблемы с регистрацией интерфейса IRequest и IRequestHandler с Autofac. Этот код работает:Интерфейс регистра Autofac MediatR

var builder = new ContainerBuilder(); 
builder.RegisterAssemblyTypes(typeof(IMediator).GetTypeInfo().Assembly).AsImplementedInterfaces(); 
builder.RegisterAssemblyTypes(typeof(Ping).GetTypeInfo().Assembly).AsImplementedInterfaces(); 
builder.RegisterControllers(Assembly.GetExecutingAssembly()); 
builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); 

Теперь я хочу, чтобы сделать это более гибким, чтобы избежать того, чтобы зарегистрировать все классы, используемые интерфейсы.

Я пытался это без удачи:

builder.RegisterGeneric(typeof(IRequest<>)).AsImplementedInterfaces(); 
builder.RegisterGeneric(typeof(IRequestHandler<,>)).AsImplementedInterfaces(); 

Это мой Ping класс:

public class Ping : IRequest<Pong> 
{ 
    public string Message { get; set; } 
} 

public class Pong 
{ 
    public string Message { get; set; } 
} 

public class PingHandler : IRequestHandler<Ping, Pong> 
{ 
    public Pong Handle(Ping message) 
    { 
     return new Pong { Message = message.Message + " Pong" }; 
    } 
} 

Любые идеи?

ответ

2

RegisterGeneric метод предназначен для регистрации открытых родовых типов, и это не ваш случай здесь.

Если вы используете .RegisterAssemblyTypes().AsImplementedInterfaces(), он должен обрабатывать типы, реализующие IRequest<T> и IRequestHandler<T1, T2>. Но если вы хотите разделить регистрацию запроса и обработчика запроса типов, вы можете сделать это с помощью следующего кода:

builder 
    .RegisterAssemblyTypes(typeof(IRequest<>).Assembly) 
    .Where(t => t.IsClosedTypeOf(typeof(IRequest<>))) 
    .AsImplementedInterfaces(); 

builder 
    .RegisterAssemblyTypes(typeof(IRequestHandler<>).Assembly) 
    .Where(t => t.IsClosedTypeOf(typeof(IRequestHandler<>))) 
    .AsImplementedInterfaces(); 

В качестве параметра .RegisterAssemblyTypes() метода вы должны пройти узел, где у вас есть типы запросов и обработчик запросов типы определены соответственно. В примере кода я предположил, что вы определили интерфейс и типы реализации в той же сборке.

+0

, так как 'IRequest' живет в сборке MediatR, нет никакой возможности, чтобы первая регистрация выбрала что-нибудь интересное. Кроме того, вы можете заменить '.Where (t => t.IsClosedTypeOf (typeof (IRequestHandler <>))). AsImplementedInterfaces()' by 'AsClosedTypesOf (typeof (IRequestHandler <>))'. –

Смежные вопросы