#c# #.net-core #dependency-injection #mediator #mediatr
#c# #.net-core #внедрение зависимостей #посредник #mediatr
Вопрос:
Я реализовал общее поведение конвейера для своих обработчиков запросов, подобное приведенному ниже:
public sealed class ErrorHandlerBehaviour<TRequest, TResponse>
: IPipelineBehavior<TRequest, ViewResult<TResponse>>
{
public async Task<ViewResult<TResponse>> Handle(
TRequest request, CancellationToken cancellationToken,
RequestHandlerDelegate<ViewResult<TResponse>> next)
{
return ViewResult.Fail();
}
}
и зарегистрировал это в контейнере, как:
services.Add(new ServiceDescriptor(
typeof(IPipelineBehavior<,>),
typeof(ErrorHandlerBehaviour<,>),
context.ServiceLifetime));
Я определил запрос и обработчик запроса:
public class GetStudent : IRequest<ViewResult<Student>>
{
public Guid Id { get; set; }
public bool ThrowError { get; set; }
}
public class GetStudentHandler
: IRequestHandler<GetStudent, ViewResult<Student>>
{
public async Task<ViewResult<Student>> Handle(
GetStudent request, CancellationToken cancellationToken)
{
if( request.ThrowError ) throw new ModelNotFoundException();
return new Student(request.Id);
}
public IViewContext ViewContext { get; }
}
но во время выполнения, когда я хочу отправить запрос через экземпляр посредника, я получаю следующую ошибку:
Тип реализации ‘ErrorHandlerBehaviour
2[GetStudent,ViewResult
1 [Student]]’ не может быть преобразован в тип сервиса ‘MediatR.IPipelineBehavior2[GetStudent,ViewResult
1[Студент]]
однако, когда я явно определяю поведение конвейера для этого обработчика запросов, он работает, а общий — нет, я что-то пропустил?
Комментарии:
1. Вы столкнулись с ограничением MS.DI. Этот контейнер DI не может обрабатывать сложные сопоставления общих типов, такие как from
<TRequest, TResponse>
to<TRequest, ViewResult<TResponse>>
. Вам следует перепроектировать этот тип или переключиться на более функциональный контейнер DI.2. Да, это правда, я только что прочитал об этом здесь: github.com/jbogard/MediatR/wiki/Container-Feature-Support