Не удалось выполнить преобразование MediatR IPipelineBehavior во время выполнения

#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.IPipelineBehavior 2[GetStudent,ViewResult 1[Студент]]

однако, когда я явно определяю поведение конвейера для этого обработчика запросов, он работает, а общий — нет, я что-то пропустил?

Комментарии:

1. Вы столкнулись с ограничением MS.DI. Этот контейнер DI не может обрабатывать сложные сопоставления общих типов, такие как from <TRequest, TResponse> to <TRequest, ViewResult<TResponse>> . Вам следует перепроектировать этот тип или переключиться на более функциональный контейнер DI.

2. Да, это правда, я только что прочитал об этом здесь: github.com/jbogard/MediatR/wiki/Container-Feature-Support