Почему настройка ведения журнала в CreateHostBuilder, а не в ConfigureServices? - PullRequest
2 голосов
/ 09 марта 2020

Контекст: Простой готовый блэйзер 3.1. Пример SERVER SIDE - добавление журналов (просто попытка получить данные для отладки conolse в VS2019 в компонентах).

Я оставляю ConfigureServices как есть, и Я нашел ТАКИЕ примеры того, что ведение журнала настроено в program.cs (!) Это работает:

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureLogging(
                logging =>
                {
                    logging.ClearProviders();
                    logging.AddConsole();
                })

и т. д.

В моих компонентах все решается нормально с

[Inject] public ILogger<Foo> Logger { get; set; }

Но почему бы не в ConfigureServices, где остальные элементы, которые должны быть DI'ed, настроены ???

  1. Есть ли DI "под капотом", который происходит? (немного похоже на то, что происходило в. Net framework w / webapi)?
  2. Можно ли переместить его в ConfigureServices с excact тот же результат (или вообще)?

1 Ответ

0 голосов
/ 09 марта 2020

В ASP. NET core 2.x вы можете частично настроить свой контейнер внедрения зависимостей в Program.cs и внедрить настроенные классы в Startup.cs. Таким образом, метод ConfigureLogging() вызывает ConfigureServices() в экземпляре IWebHostBuilder и настраивает некоторые параметры. Поскольку эти службы настраиваются в контейнере DI до создания экземпляра Startup, их можно внедрить в конструктор Startup:

public Startup(
  IConfiguration configuration, 
  ILogger<Startup> logger) // Inject pre-configured service
{
}

Подробнее

Но этот подход больше не поддерживается в ASP. NET Core 3.0! Проблема заключается в том, что он требует построения контейнера внедрения зависимостей дважды .

  1. Есть ли "под капотом" DI происходит? (немного похоже на то, что происходило. Net FrameWork W / Webapi)?

ConfigureLogging просто позвоните ConfigureServices без построения поставщика услуг

public static IWebHostBuilder ConfigureLogging(this IWebHostBuilder hostBuilder, Action<WebHostBuilderContext, ILoggingBuilder> configureLogging)
{
     return hostBuilder.ConfigureServices((context, collection) => collection.AddLogging(builder => configureLogging(context, builder)));
}
Можно ли переместить его в ConfigureServices с точно таким же результатом (или вообще)?

да, вы можете переместить его в ConfigureServices, и результат будет таким же

public void ConfigureServices(IServiceCollection services)
{
    services.AddLogging(builder =>
    {
        builder.ClearProviders();
        builder.AddConsole();
    });
}

Итак, куда добавить конфигурацию ведения журнала, зависит от вас. Ведение журнала является инфраструктурой и может быть добавлено в качестве конфигурации хоста в Program.cs. Ваши бизнес-классы должны быть добавлены в DI при запуске.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...