Циклическая зависимость конфигурации телеметрии с пользовательским инициализатором ITelemetryInitializer — Application Insights ASP.NET Ядро 5.0

#asp.net-core #dependency-injection #azure-application-insights

Вопрос:

Я пытаюсь реализовать пользовательский ITelemetryInitializer ( UserTelemetryInitialiser ), который присоединяет некоторые пользовательские метаданные к сообщениям app insights, и я получаю следующую циклическую зависимость.

UserTelemetryInitialiser переходит в кэш пользователей, который зависит от IMemoryCache того, как реализовано Microsoft.Extensions.Caching.Memory.MemoryCache . MemoryCache затем зависит от ILoggerFactory (реализуется Microsoft.Extensions.Logging.LoggerFactory ) и LoggerFactory в конечном итоге зависит от TelemetryConfiguration .

Итак, у меня есть эта (укороченная) круговая цепочка: TelemetryConfiguration -> > UserTelemetryInitialiser -> > MyUserCache -> > MemoryCache -> > LoggerFactory -> > TelemetryConfiguration .

Есть какие-нибудь идеи о том, как это решить?

Я использую ASP.NET Ядро 5.0 с Microsoft.Области применения.AspNetCore 2.18.0.

ИЗМЕНИТЬ: Мой упрощенный инициализатор выглядит следующим образом (где IHttpContextAccessor используется для получения удостоверения пользователя):

    public class UserTelemetryInitialiser : ITelemetryInitializer
   {
       private readonly IHttpContextAccessor contextAccessor;
       private readonly IMemoryCache cache;

        public UserTelemetryInitialiser(IHttpContextAccessor contextAccessor,  IMemoryCache cache)
        {
            this.contextAccessor = contextAccessor;
            this.cache = cache;
        }
        public void Initialize(ITelemetry telemetry)
        {
        }
    }
 

Комментарии:

1. Зачем вам нужно кэшировать абстракцию телеметрии? Что вы кэшируете?

2. У меня есть кэш моих пользователей, и я хочу получить доступ к этому кэшу, MyUserTelemetryInitializer чтобы я мог прикрепить роль пользователя к сообщениям app insights (системный администратор, суперпользователь и т. Д.).

3. Я не уверен, но если это сработает, я могу опубликовать хорошо структурированный улучшенный ответ — внедрить IServiceProvider в ваш класс и использовать services.GetRequiredService<IMemoryCache>() — это работает?

4. У меня есть инициализатор телеметрии, который использует тот же кэш, но не имеет никаких проблем. Как выглядит инициализатор?

5. @PeterBons Я обновил свой вопрос, чтобы показать, на что похож инициализатор (это упрощенная версия реальной вещи, которая все еще демонстрирует проблему)