Контекст
При попытке упростить MediatR код, мы создали общий запрос/ответ/комбинацию обработчиков для GETALL, GetSingle и т.да .. функциональность. Ниже вы можете найти реализацию GETALLAutofac: Регистрация всех MediatR обработчиков как внутренние классы родовых типов
public class GetAll<T> where T : class
{
public class Request : IRequest<Response>
{
}
public class Response
{
public IQueryable<T> All { get; set; }
}
public class Handler : IRequestHandler<Request, Response>
{
private readonly IRepository<T> repository;
public Handler(IRepository<T> repository)
{
this.repository = repository;
}
public Response Handle(Request message)
{
return new Response
{
All = repository.GetAll()
};
}
}
}
Проблему
Мы не можем показаться, чтобы зарегистрировать все наши RequestHandlers сразу используя Autofac.
Мы можем зарегистрировать один конкретный тип обработчика в нашем модуле Autofac с помощью:
builder.RegisterGeneric(typeof(GetAll<>.Handler)).AsImplementedInterfaces();
Но мы хотели бы сделать это для всех реализаций IRequestHandler<,>
(а не просто GETALL один) , Мы попытались это с помощью функции AsClosedTypesOf
, как предлагается в документации:
builder.RegisterAssemblyTypes(typeof(GetAll<>.Request).Assembly)
.AsClosedTypesOf(typeof(IRequestHandler<,>));
или
builder.RegisterAssemblyTypes(typeof(GetAll<>.Request).Assembly)
.AsClosedTypesOf(typeof(IRequestHandler<,>))
.AsImplementedInterfaces();
Но это дает следующее исключение:
Autofac.Core.Registration.ComponentNotRegisteredException : 'Запрашиваемая услуга
'MediatR.IRequestHandler<GetAll<T>.Request,GetAll<T>.Response>'
не была зарегистрирована. Чтобы избежать этого исключения, зарегистрируйте компонент для предоставления услуги, проверьте регистрацию службы с помощью IsRegistered() или используйте метод ResolveOptional() для разрешения дополнительной зависимости. '
Что мы делаем неправильно (или забываем) здесь?
Возможно, вы можете использовать мою реализацию mapmap. Это далеко не идеально, так как я должен был указать типы (команда <>, commandHandler <>, query <>, ...), но, возможно, вы можете начать с нее: https: //gist.github.com/hudo/0e9fb466c3fac5a04aa1b77cc95490e5 –