Содержание
В предыдущей части мы создали пустое приложение 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
позволяет управлять приложением и, при необходимости, программно завершать его работу.