Autofac + .NET Core - использовать InstancePerHttpRequest из одноэлементной / корневой области - PullRequest
0 голосов
/ 23 мая 2018

Я использую 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 без доступа к средству разрешения зависимостей

...