TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.77K subscribers
Post #1308 1.44K
День 1063. #ЗаметкиНаПолях #ExploringNET6
Исследуем .NET 6. Часть 5
В этой серии статей рассмотрим подробно некоторые из новых функций, которые появились в .NET 6.
Часть 1
Часть 2
Часть 3
Часть 4

Поддержка EF Core в WebApplicationBuilder
EF Core включает в себя различные инструменты для создания миграций и запуска их в вашей базе данных, но для этого ему необходимо понимать ваш код. По сути, он должен иметь возможность исполнять код запуска вашего приложения, чтобы использовать все настроенные вами сервисы конфигурации и внедрения зависимостей.

В предыдущих версиях ASP.NET Core EF Core подключался к методу CreateWebHostBuilder или CreateHostBuilder в вашем классе Program. Инструменты EF Core искали этот «волшебный» метод для получения доступа к IWebHostBuilder или IHostBuilder, используемый для создания вашего приложения. Так инструменты EF Core могли загрузить сборку вашего приложения с помощью рефлексии, выполнить этот метод, получить возвращённый IHostBuilder, вызвать на нём Build() для создания IHost, а затем получить IServiceProvider из свойства IHost.Services, и, уже используя этот провайдер, проанализировать практически всё, что связано с вашим приложением.

Поддержка инструментов EF Core в .NET 6
Чтобы обойти изменения, внесённые в .NET 6, в HostBuilder были добавлены новые события DiagnosticSource. Они позволяют подписчикам получить доступ к HostBuilder непосредственно перед его построением, а также доступ к экземпляру IHost сразу после его создания:
1. На время действия метода HostBuilder.Build() создаётся новый DiagnosticListener.
2. Если что-либо прослушивает событие Microsoft.Extensions.Hosting.HostBuilding (хост строится), HostBuilder передает себя (this) слушателю в качестве параметра метода diagnosticListener.Write().
3. После создания хоста и перед возвратом из метода HostBuilder проверяет, прослушивает ли что-нибудь событие Microsoft.Extensions.Hosting.HostBuilt (хост построен). Если это так, вновь созданный хост передаётся слушателю в качестве параметра того же метода diagnosticListener.Write().

Вот как инструменты EF Core используют эти события (см. схему ниже):
1. Загружается сборка вашего приложения.
2. Создаётся экземпляр вспомогательного класса HostFactoryResolver, который ищет и исполняет точку входа в приложение (например, Program.Main).
3. Точка входа запускается в фоновом потоке. Это запускает ваше приложение. И предполагается, что в какой-то момент ваше приложение вызовет HostBuilder.Build().
4. Идёт ожидание одного из трёх событий:
- Код слушателя выдаёт исключение StopTheHostException после завершения всей настройки (об этом ниже).
- В запущенном приложении возникает иное исключение.
- Запуск приложения занимает слишком много времени, поэтому прерывается по таймауту.
5. Результат (в виде построенного хоста или в виде сгенерированного исключения) передаётся инструментам EF Core.

Пара слов о StopTheHostException. Запущенное в фоновом потоке приложение после постройки хоста может продолжать работу, и, например, начать прослушивать порты. Чтобы этого не происходило, слушатель событий, находящийся в том же потоке, после получения события HostBuilt (хост построен), выбрасывает исключение StopTheHostException, которое не обрабатывается, вызывая завершение приложения.

Подробный перевод статьи с примерами кода размещён на Хабре.

Источник: https://andrewlock.net/exploring-dotnet-6-part-5-supporting-ef-core-tools-with-webapplicationbuilder/
More from @netdeveloperdiary
  1. Oct 15, 2026Post #3374
  2. Oct 14, 2026Post #3373
  3. Oct 13, 2026День 2813. #ЗаметкиНаПолях #Async Ещё Раз Про Async/Await в C#. Часть 1 Почему существует…
  4. Oct 12, 2026День 2812. #Карьера #AI Как Разработчикам Оставаться Полезными, Когда Код Пишет ИИ? По мер…
  5. Oct 11, 2026День 2811. #ВопросыНаСобеседовании Марк Прайс предложил свой набор из 60 вопросов (как тех…
  6. Oct 10, 2026День 2810. #ЧтоНовенького #VSCode Более Быстрый и Лёгкий C# Dev Kit Мы, разработчики, люби…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →