IRequestExceptionHandler не может быть правильно разрешен, хотя тип ответа является универсальнымC#

Место общения программистов C#
Ответить
Anonymous
 IRequestExceptionHandler не может быть правильно разрешен, хотя тип ответа является универсальным

Сообщение Anonymous »

На основе
https://code-maze.com/csharp-global-Exc ... -requests/
Можно ли с помощью MediatR создать общий RequestExceptionHandler для любых запросов?
Я пытался реализовать универсальный IRequestExceptionHandler для MediatR, который перехватывал бы все исключения и переводил их в правильный объект ошибки результата.Net 8.0, MediatR 8.X
Проблема, с которой я столкнулся, заключалась в том, что, как бы я ни старался, мне не удавалось достичь точки останова Handle. Я проверил конфигурацию IoC, и обработчик исключений явно был зарегистрирован как открытый универсальный вариант.
После многих часов биения головой о стену у меня возникла идея попробовать измените мою тестовую команду/обработчик, чтобы она возвращала GenericResult вместо GenericResult только для теста. К моему удивлению, обработчик наконец-то заработал. **Ofc GenericResult : GenericResult**
Есть ли у открытых универсальных шаблонов какое-то очень упрощенное ограничение, например, тип, предоставленный для разрешения для открытой универсальной регистрации, не может быть универсальным сам по себе ? (допустим, у меня есть репозиторий, зарегистрированный как Repository, попытка разрешить Repository в порядке, но Repository не поддерживается или это ограничение МедиатР

Код: Выделить всё

public class GenericExceptionHandler : IRequestExceptionHandler
where TRequest : notnull
where TResponse : GenericResult, new()
where TException : Exception
{
private readonly ILogger _logger;

public GenericExceptionHandler(ILogger logger)
{
_logger = logger;
}

public Task Handle(TRequest request, TException exception, RequestExceptionHandlerState state, CancellationToken cancellationToken)
{
_logger.LogError(exception, "An error has occurred during handler execution for {requestType}", typeof(TRequest).Name);
_logger.LogDebug(exception, "An error has occurred during handler execution for {requestType} {@request}", typeof(TRequest).Name, request);
var response = new TResponse();

state.SetHandled(response);
return Task.CompletedTask;
}
}
Все регистрируется с помощью

Код: Выделить всё

    services.AddMediatR(configuration =>
{
configuration.RegisterServicesFromAssembly(typeof(IoCConfig).Assembly);
});
Обработчик теста выглядит следующим образом.
public class SyncModulesCommandHandler: IRequestHandler
{

Код: Выделить всё

public Task Handle(SyncModulesCommand request, CancellationToken cancellationToken)
{
throw new InvalidOperationException();
}
}

Подробнее здесь: https://stackoverflow.com/questions/787 ... type-is-ge
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»