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

WebApplicationBuilder
В .NET появился новый способ «по умолчанию» для создания приложений, используя WebApplication.CreateBuilder(). Во всех предыдущих версиях ASP.NET Core конфигурация разделена на 2 файла: Program.cs и Startup.cs (см. рисунок ниже). В .NET 6 добавлено множество изменений в C#, BCL и ASP.NET Core, и теперь всё может быть в одном файле.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();

var app = builder.Build();
app.UseStaticFiles();
app.MapGet("/", () => "Hello World!");
app.MapRazorPages();
app.Run();

WebApplicationBuilder
Для начала рассмотрим WebApplicationBuilder.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();

Он отвечает за 4 основные вещи:
1. Добавление конфигурации с помощью builder.Configuration. Он предоставляет тип ConfigurationManager для добавления новых источников конфигурации, а также для доступа к значениям конфигурации, как я описал в предыдущем посте.

2. Добавление сервисов с помощью builder.Services. Предоставляет доступ к IServiceCollection напрямую для добавления сервисов в контейнер DI.

3. Аналогично для журнала с помощью builder.Logging. Вы можете использовать, Например:
builder.Logging.AddFile();

4. Общая конфигурация IHostBuilder и IWebHostBuilder. Для тех точек расширения, которые напрямую зависят от IHostBuilder или IWebHostBuilder, WebApplicationBuilder предоставляет свойства Host и WebHost соответственно. Например, настройка Serilog для ASP.NET Core подключается к IHostBuilder. С помощью WebApplicationBuilder вы можете вызвать UseSerilog() на свойстве Host:
builder.Host.UseSerilog();

Фактически, WebApplicationBuilder – это то место, где вы выполняете всю настройку, кроме конвейера промежуточного ПО.

WebApplication
После того, как вы настроили всё необходимое в WebApplicationBuilder, вы вызываете Build() для создания экземпляра WebApplication:
var app = builder.Build();

WebApplication реализует несколько различных интерфейсов:
- IHost – для запуска и остановки хоста.
- IApplicationBuilder – для создания конвейера промежуточного ПО.
- IEndpointRouteBuilder – для добавления конечных точек.

Два последних пункта во многом связаны. В ASP.NET Core 3.x и 5 IEndpointRouteBuilder используется для добавления конечных точек путем вызова UseEndpoints() и передачи ему лямбды, например:
public void Configure(IApplicationBuilder app)
{
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}

WebApplication значительно упрощает этот шаблон:
app.UseStaticFiles();
app.MapRazorPages();

Это явно намного проще, хотя немного обманчиво, поскольку различие между промежуточным ПО и конечными точками гораздо менее очевидно, чем в .NET 5.x. Вероятно, это просто дело вкуса, но такой подход несколько размывает концепцию важности порядка настройки (которая относится к промежуточному ПО, но не к конечным точкам).

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

Источник: https://andrewlock.net/exploring-dotnet-6-part-2-comparing-webapplicationbuilder-to-the-generic-host/
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 →