Я использую Serilog с Autofac и .NET Core.Я использую Serilog Enricher, который требует экземпляра во время установки.
var enricher = new ContextEnricher();
Configuration = new LoggerConfiguration()
.MinimumLevel.ControlledBy(new LoggingLevelSwitch { MinimumLevel = logLevel })
.Enrich.WithThreadId()
.Enrich.With(enricher)
.WriteTo.ApplicationInsightsTraces(applicationInsightsKey)
.WriteTo.Console();
Log.Logger = Configuration.CreateLogger();
В идеале я хочу, чтобы мой регистратор был собран до того, как будет построен мой DI-контейнер, чтобы я мог перехватывать ошибки как можно скорее.Проблема заключается в том, что мой журнал обогащения должен что-то потреблять в RequestScope, но он настраивается еще до того, как DI вообще произойдет.Очевидное направление - использовать фабричную функцию после сборки контейнера.
public class ContextEnricher : IContextEnricher
{
public Func<ICorrelationProvider> GetCorrelationProvider { get; set; }
public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
{
if (GetCorrelationProvider == null) return;
var correlationProvider = GetCorrelationProvider();
if (correlationProvider == null) return;
logEvent.AddOrUpdateProperty(new LogEventProperty("CorrelationId", new ScalarValue(correlationProvider.CorrelationId)));
}
}
Я основал это решение на этой статье: https://robdmoore.id.au/blog/2013/03/23/resolving-request-scoped-objects-into-a-singleton-with-autofac
Проблема в том, что статья использует:
return () => DependencyResolver.Current.GetService<T>();
Как заводская функция - но DependencyResolver не существует в .NET Core.
Я попытался использовать:
return () => Container.Resolve<T>();
Но получите эту ошибку времени выполнения:
Нет области видимости с тегом, совпадающим с 'AutofacWebRequest', из области, в которой был запрошен экземпляр.Если вы видите это во время выполнения веб-приложения, это обычно означает, что компонент, зарегистрированный как запрос на HTTP, запрашивается компонентом SingleInstance () (или похожим сценарием).При веб-интеграции всегда запрашивайте зависимости из средства разрешения зависимостей или области действия запроса, а не из самого контейнера.
Как правильно добиться этого в .NET Core без доступа к средству разрешения зависимостей