Основные сведения о классах WebApplication и WebApplicationBuilder

В предыдущей части мы создали пустое приложение ASP.NET Core, которое, по сути, использует Minimal API, т.е. создание и настройка приложения сведена к необходимому минимум. Сегодня рассмотрим более детально содержимое файла Program.cs.

Program.cs в пустом шаблоне ASP.NET Core

На момент создания приложения с пустым шаблоном ASP.NET Core наш файл Program.cs содержит следующий код:

namespace MySite
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);
            var app = builder.Build();

            app.MapGet("/", () => "Hello World!");

            app.Run();
        }
    }
}

В классе Program содержится статический метод Main в котором создаются переменные builder и app (приложение), а также производится запуск созданного приложения. Если использовать вместо var явны типы, то первые две строки в методе Main будут следующие:

WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
WebApplication app = builder.Build();

Класс WebApplicationBuilder

Создание приложение фактически начинается с создания объекта класса WebApplicationBuilder.

Для создания такого объекта вызывается статический метод WebApplication.CreateBuilder(). Для инициализации объекта WebApplicationBuilder в этот метод по умолчанию передаются аргументы командной строки (args), указанные при запуске приложения. Также, мы можем передавать в качестве параметра метода объект класса WebApplicationOption, например, так:

WebApplicationOptions options = new() { Args = args };
WebApplicationBuilder builder = WebApplication.CreateBuilder(options);

Помимо того, что созданный объект builder в дальнейшем используется для создания объекта класса WebApplication (приложение), WebApplicationBuilder выполняет также ряд задач, таких как установка конфигурации приложения, настройка логирования в приложении, добавление в приложение различных сервисов и т.д. Для этих задач у класса WebApplicationBuilder определены следующие свойства:

Configuration Коллекция поставщиков конфигурации для создания приложения. Это свойство используется для добавления новых источников конфигурации приложения.
Environment Предоставляет сведения об окружении приложения.
Host Объект IHostBuilder, который может использоваться для настройки свойств узла (хоста).
Logging Коллекция поставщиков ведения журнала (логирования) приложения.
Services Коллекция служб (сервисов), используемых приложением. Например, с помощью этого свойства можно добавить в приложение службу аутентификации пользователей
WebHost Объект IWebHostBuilder для настройки отдельных свойств сервера.

 

Класс WebApplication

Класс WebApplication предоставляет нам возможности управления приложением. Объект этого класса создается при вызове метода Build() класса WebApplicationBuilder

WebApplicationBuilder builder = WebApplication.CreateBuilder(args); 
WebApplication app = builder.Build();

или же, если нас не интересуют настройки, логирования, сервисов и т.д. (то есть всё то, что можно выполнить в WebApplicationBuilde), то можно воспользоваться статическим методом самого класса WebApplication:

// WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
// WebApplication app = builder.Build();
WebApplication app = WebApplication.Create(args);

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

Configuration представляет конфигурацию приложения в виде объекта IConfiguration
Environment представляет окружение приложения в виде IWebHostEnvironment
Lifetime позволяет пользователям получать уведомления о событиях жизненного цикла приложения.
Logger представляет объект для ведения журнала для приложения.
Services представляет список сервисов приложения.
Urls представляет список URL-адресов, к которым привязан HTTP-сервер.

Также класс WebApplication содержит следующие методы для управления приложением:

Run(String) Запускает приложение и блокирует вызывающий поток, пока работа узла не будет завершена.
RunAsync(String) Запускает приложение и возвращает объект Task, который завершается только при активации токена или завершении работы.
StartAsync(CancellationToken) Запускает приложение.
StopAsync(CancellationToken) Завершает работу приложения.

 

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

public static async Task Main(string[] args)
{
     WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
     WebApplication app = builder.Build();
    //WebApplication app = WebApplication.Create(args);

    app.MapGet("/", () => "Hello World!");

    await app.StartAsync();
    await Task.Delay(5000);//ждем 5 сек
    await app.StopAsync();  
    
}

Здесь стоит отметить, что вместо асинхронного метода RunAsync() мы использовали метод StartAsync(). Такая замена потребовалась в связи с тем, что вызов Run/RunAsync создают приложение и возвращают результат только после того, как приложение завершит свою работу, в то время как StartAsync запускает приложение и сразу возвращает результат. Иначе говоря, если мы используем RunAsync, то никогда не дождемся автоматического завершения работы приложения. Для того, чтобы убедиться в сказанном, попробуется изменить код метода Main следующим образом:

public static async Task Main(string[] args)
{
    WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
    WebApplication app = builder.Build();

    app.MapGet("/", () => "Hello World!");

    await app.RunAsync();
    await Task.Delay(5000);//никогда не дойдем до сюда
    await app.StopAsync();  
    
}

Итого

Сегодня мы более подробно разобрались с созданием и запуском приложения ASP.NET Core и рассмотрели классы WebApplicationBuilder и WebApplication. Объект  класса WebApplicationBuilder позволяет проводить настройку поставщиков конфигурации приложения, логирования, добавлять в приложение сервисы. WebApplication позволяет управлять приложением и, при необходимости, программно завершать его работу.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии