我正在使用Serilog和Autofac以及.NET Core。我正在使用serilog richher,在安装过程中需要一个实例。
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)));
}
}
问题是,文章使用:
return () => DependencyResolver.Current.GetService<T>();
作为工厂函数 - 但.NET Core中不存在DependencyResolver。
我尝试过使用:
return () => Container.Resolve<T>();
但是得到这个运行时错误:
从中可以看到没有与“AutofacWebRequest”匹配的标记的范围 请求实例的范围。如果你在这期间看到这个 执行一个Web应用程序,它通常表示一个 a请求注册为每个HTTP请求的组件 SingleInstance()组件(或类似场景)。在网络下 集成始终从依赖项解析程序请求依赖项 或者请求生命周期范围,永远不要从容器本身。
在没有访问依赖项解析程序的情况下,在.NET Core中实现此目的的正确方法是什么?