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
Мобильная версия