Содержание
В предыдущей части мы создали пустое приложение 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 |
Коллекция служб (сервисов), используемых приложением. Например, с помощью этого свойства можно добавить в приложение службу аутентификации пользователей |
Web |
Объект 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) |
Запускает приложение и блокирует вызывающий поток, пока работа узла не будет завершена. |
Run |
Запускает приложение и возвращает объект Task, который завершается только при активации токена или завершении работы. |
Start |
Запускает приложение. |
Stop |
Завершает работу приложения. |
В следующем примере показано как, используя приведенные выше методы, остановить приложение через 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 позволяет управлять приложением и, при необходимости, программно завершать его работу.