Исследуем .NET 6. Часть 3
В этой серии статей рассмотрим подробно некоторые из новых функций, которые появились в .NET 6.
Часть 1
Часть 2
Рассматриваем код WebApplicationBuilder
Напомню стандартный шаблон нового минимального API приложения ASP.NET Core:
WebApplicationBuilder builder = WebApplication.CreateBuilder(args);Первым шагом является создание экземпляра
// добавляем конфигурацию
builder.Configuration.AddJsonFile("sharedsettings.json");
// добавляем сервисы
builder.Services.AddSingleton<MyTestService>();
builder.Services.AddRazorPages();
// добавляем ведение журнала
builder.Logging.AddFile();
// строим!
WebApplication app = builder.Build();
app.UseStaticFiles();
// добавляем конечные точки
app.MapGet("/", () => "Hello World!");
app.MapRazorPages();
// запускаем!
app.Run();
WebApplicationBuilder с использованием статического метода класса WebApplication:WebApplicationBuilder builder = WebApplication.CreateBuilder(args);Ниже приведены приватные и публичные члены класса
WebApplicationBuilder:public sealed class WebApplicationBuilderПубличный API состоит из набора свойств только для чтения, и метода
{
private readonly HostBuilder _hostBuilder = new();
private readonly BootstrapHostBuilder _bootstrapHostBuilder;
private readonly WebApplicationServiceCollection _services = new();
public IWebHostEnvironment Environment { get; }
public IServiceCollection Services { get; }
public ConfigurationManager Configuration { get; }
public ILoggingBuilder Logging { get; }
public ConfigureWebHostBuilder WebHost { get; }
public ConfigureHostBuilder Host { get; }
public WebApplication Build()
}
Build(), который создаёт WebApplication.Многие из этих свойств используют стандартные типы из предыдущих версий:
- IWebHostEnvironment – используется для получения имени среды, пути к корню контента и подобных значений.
- IServiceCollection – используется для регистрации сервисов в контейнере DI. Обратите внимание, что это альтернатива методу
ConfigureServices(), используемому универсальным хостом для достижения того же результата.- ConfigurationManager – используется как для добавления новой конфигурации, так и для получения значений конфигурации. См. первый пост в серии, где обсуждается этот вопрос.
- ILoggingBuilder – используется для регистрации дополнительных поставщиков журналов, как и в случае с методом
ConfigureLogging() в универсальном хосте.- Свойства WebHost и Host интересны тем, что они предоставлены новыми типами
ConfigureWebHostBuilder и ConfigureHostBuilder. Эти типы реализуют IWebHostBuilder и IHostBuilder соответственно и в основном представлены как замена для используемых ранее методов расширения.Приватные члены класса содержат:
- вспомогательный класс BootstrapHostBuilder, который «запоминает» переданные ему делегаты конфигурации для последующего их вызова в правильном порядке при построении хоста. Кроме того, он вызывает знакомые нам по .NET 3.x/5 методы расширения
CreateDefaultBuilder и ConfigureWebHostDefaults.- HostBuilder – экземпляр универсального хоста, который является «внутренним» хостом в
WebApplicationBuilder. WebApplicationBuilder действует как «адаптер» для универсального хоста _hostBuilder, предоставляя императивный API и сохраняя при этом ту же функциональность, что и универсальный хост.См. рисунок ниже.
В методе Build() вся конфигурация, сделанная по умолчанию, а также добавленная пользователем в файле
Program.cs, передаётся в _hostBuilder в правильном порядке, и возвращается новый экземпляр WebApplication, в конструктор которого передаётся построенный «внутренний» хост:_builtApplication = new WebApplication(_hostBuilder.Build());Подробнее перевод статьи с примерами кода размещён на Хабре.
…
return _builtApplication;
Источник: https://andrewlock.net/exploring-dotnet-6-part-3-exploring-the-code-behind-webapplicationbuilder/