Пользовательская регистрация без конструктора DI

#c# #asp.net-core #logging #.net-core #dependency-injection

#c# #asp.net-core #ведение журнала #.net-ядро #внедрение зависимостей

Вопрос:

Как я могу регистрировать пользовательскую информацию / ошибку на основе поставщиков, зарегистрированных без внедрения зависимостей конструктора в каждом классе? (из-за того, что у меня есть один контроллер, несколько репозиториев, вызываемых внутри контроллера, и я не могу изменить конструктор класса repo i, e.)

Например, я хочу зарегистрировать информацию в приведенном ниже контексте, не касаясь конструктора контроллера

 public override void OnException(ExceptionContext context)
        {
            base.OnException(context);
            var logger = Dependency.Resolve<ILogger>();
            **//var logger = getIloggerSomehow from startup regsistred loggers**

            logger.LogInformation("Custom Info");

        }
  

Мои службы запуска представлены ниже, и они записывают журналы dotnet и Microosft везде, где я ожидаю.
Как я могу написать пользовательский журнал во всех этих местах?

 services.AddLogging(loggingBuilder =>
              {
                    loggingBuilder.AddConfiguration(Configuration.GetSection("Logging"));                    loggingBuilder.AddAWSProvider(Configuration.GetAWSLoggingConfigSection());
                loggingBuilder.SetMinimumLevel(LogLevel.Debug);
                loggingBuilder.AddConsole();
                loggingBuilder.AddDebug();
            });
  

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

1. Почему? Это жестко кодирует ссылку на контейнер DI, именно то, ILogger что должно предотвращать. Вместо того, чтобы зависеть только от библиотеки ведения журнала, теперь вы будете зависеть от библиотеки ведения журнала и конкретной библиотеки DI

2. @PanagiotisKanavos, спасибо. в противном случае, как я могу добавить сюда пользовательское ведение журнала, которое будет распространяться среди всех поставщиков

3. Вы могли бы использовать одноэлементный LoggingFactory и использовать его для создания регистраторов по мере необходимости или даже создать одноэлементный регистратор. Таким образом, вы избегаете зависимости от контейнера DI. Снова why имеет значение

4. how can i add the custom logging here whihc will be distributed to all providers путем настройки ведения журнала внутри AddLogging . Внедрение конструктора делает это проще , а не сложнее — внедрение не влияет на то, как работает ведение журнала, но вам не нужно заглядывать в несколько мест, чтобы создать свой регистратор, и вам не нужно беспокоиться об отсутствии поля регистратора. Что все же означает эта фраза? Какой тип пользовательского ведения журнала вы имеете в виду?

5. В принципе, мне нужен глобальный объект журнала, с помощью которого я могу входить в систему. LogInformation() через приложения out

Ответ №1:

Вы можете разрешить службу из context в OnException методе:

 using Microsoft.Extensions.DependencyInjection;
...
var service = context.HttpContext.RequestServices.GetService<ILogger<YourFilter>>();
  

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

1. var logger = context.HttpContext.RequestServices. GetService<ILogger>(); всегда имеет значение null

2. Как вы регистрировались ILogger тогда?

3. Или вы пытаетесь разрешить ILogger<T> ? Тогда просто замените T тип фильтра. Смотрите мою правку.

4. я зарегистрировал Ilogger sa в службах ниже. Добавить блокировку(loggingBuilder => { loggingBuilder. Добавить конфигурацию (Configuration. GetSection(«Ведение журнала»)); loggingBuilder. AddAWSProvider(Конфигурация. Получаем LOGGINGCONFIGSECTION()); loggingBuilder. Установите минимальный уровень (LogLevel. Отладка); loggingBuilder. AddConsole(); loggingBuilder. AddDebug(); });

5. Ты пробовал context.HttpContext.RequestServices.GetService<ILogger<YourClass>>(); ?