Когда и как включается DI в asp netcore

91
30 мая 2021, 07:10

В описаниях DI для asp netcore пишут, что настройка выполняется в ConfigureServices() класса Startup.

Но как тогда уже в конструкторе (!!!) этого класса можно передавать параметр IConfiguration выходит DI включается еще раньше?

В пустом проекте класс выглядит так:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

но в некоторых вопросах вижу, что можно передать еще другие параметры:

public class Startup
{
    public Startup(IConfiguration configuration, IHostingEnvironment env)
    {

Где же тогда происходт настройка этого и что можно еще передать на конструктор?

Смотрел в Program.cs но там пусто:

public static class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }
    private static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
}
Answer 1

Это всё делается внутри CreateDefaultBuilder, там написано (упрощённо) следующее:

Создаётся билдер и настраиваются параметры args из командной строки (если есть):

  WebHostBuilder hostBuilder = new WebHostBuilder();
  if (args != null)
    hostBuilder.UseConfiguration((IConfiguration) new ConfigurationBuilder().AddCommandLine(args).Build());

Потом включается веб-сервер Kestrel и у него сразу устанавливается IHostingEnvironment, настраивается логирование, первые сервисы (и потому вы можете использовать это всё в своём Startup.cs) и включается поддержка IIS.

    hostBuilder.UseKestrel( ...
      {
        IHostingEnvironment hostingEnvironment = hostingContext.HostingEnvironment;
      })).ConfigureLogging( ...
      {
        logging.AddConfiguration(
        logging.AddConsole();
        logging.AddDebug();
        logging.AddEventSourceLogger();
      })).ConfigureServices( ...      
      }))
      .UseIIS().UseIISIntegration().UseDefaultServiceProvider();
      return (IWebHostBuilder) hostBuilder;

Всё остальное это уже потом вы сами включаете в Startup.cs по потребности (например, DbContext и т.п. вещи)

и что можно еще передать на конструктор

Судя по документации можно три вещи:

  • IHostingEnvironment
  • IConfiguration
  • ILoggerFactory

Лично мне кроме штатного IConfiguration только однажды пришлось писать собственный провайдер конфигурации, а примеры на логирование я только синтетические писал на обучении.

READ ALSO
Покраска Excel при экспорте

Покраска Excel при экспорте

нужно покрасить определенные столбцы в другой цвет, но проблема в том, что он красит не только столбцы, но и все ячейки до конца файла, как...

91
Chrome failed to start: exited abnormally (unknown error: DevToolsActivePort file doesn&#39;t exist) Тест первый запустился прошел

Chrome failed to start: exited abnormally (unknown error: DevToolsActivePort file doesn't exist) Тест первый запустился прошел

проблема в чем: поставил chromedriver через консоль, тест первый раз запустился прошел, следующий сразу упал, потом постоянно такая ошибка, возможно...

147
Не могу добавить строку запроса в url

Не могу добавить строку запроса в url

Пытаюсь добавить в URL строку запроса Чтобы было https://localhost:44390/paramaspx?login=11 листинг

74
Алгоритм слипания пузырей

Алгоритм слипания пузырей

Встретил на днях в игре механику соединяющихся пузырейВот пример

192