Исследуем .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/