Autofac + .NET Core - 从单例/根范围使用InstancePerHttpRequest

时间:2018-05-22 22:46:08

标签: c# dependency-injection .net-core autofac serilog

我正在使用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)));
    }
}

我的解决方案基于本文:https://robdmoore.id.au/blog/2013/03/23/resolving-request-scoped-objects-into-a-singleton-with-autofac

问题是,文章使用:

 return () => DependencyResolver.Current.GetService<T>();

作为工厂函数 - 但.NET Core中不存在DependencyResolver。

我尝试过使用:

 return () => Container.Resolve<T>();

但是得到这个运行时错误:

  

从中可以看到没有与“AutofacWebRequest”匹配的标记的范围   请求实例的范围。如果你在这期间看到这个   执行一个Web应用程序,它通常表示一个   a请求注册为每个HTTP请求的组件   SingleInstance()组件(或类似场景)。在网络下   集成始终从依赖项解析程序请求依赖项   或者请求生命周期范围,永远不要从容器本身。

在没有访问依赖项解析程序的情况下,在.NET Core中实现此目的的正确方法是什么?

0 个答案:

没有答案