В случае, если зависимости HttpGlobalExceptionFilter
(в настоящее время ILogger
) являются одиночными, вы можете упростить свое решение, исключив SimpleInjectorExceptionFilterDispatcher
. Это уменьшит решение до следующего:
options.Filters.Add(new HttpGlobalExceptionFilter(new LoggerAdapter()));
Это создает фильтр и его зависимости вручную. Вы также можете разрешить это из контейнера. Чтобы убедиться, что вы случайно не создаете зависимостей Captive , вы должны убедиться, что вы зарегистрировали HttpGlobalExceptionFilter
как Singleton
:
container.RegisterSingleton<HttpGlobalExceptionFilter>();
services.AddMvc(options =>
{
options.Filters.Add(this.container.GetInstance<HttpGlobalExceptionFilter>());
});
Вместо использования фильтров MVC вы также можете перейти на один уровень вверх и определить компонент промежуточного программного обеспечения и подключить его, как описано здесь в документации по Simple Injector. Это еще больше упрощает регистрацию, хотя может усложнить вашу реализацию в зависимости от ваших конкретных потребностей.
Это означает переписывание вашего HttpGlobalExceptionFilter
в компонент промежуточного программного обеспечения. Это может выглядеть примерно так:
public sealed class HttpGlobalExceptionMiddleware
: Microsoft.AspNetCore.Http.IMiddleware
{
private readonly Infrastructure.Common.ILogger logger;
public HttpGlobalExceptionMiddleware(ILogger logger) =>
this.logger = logger;
public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{
try
{
await next(context);
}
catch (Exception ex)
{
var error = $"An error occured: {ex.Message}";
this.logger.LogError(error);
throw;
}
}
}
Используя метод расширения UseMiddleware
Simple Injector, вы можете зарегистрировать его в Simple Injector и одновременно добавить его в промежуточный конвейер ASP.NET Core:
app.UseMiddleware<HttpGlobalExceptionMiddleware>(container);