Запуск Razor Pages в .NET 6

  • Михаил
  • 12 мин. на прочтение
  • 141
  • 25 Nov 2022
  • 25 Nov 2022

Когда вы создаете новое веб-приложение с помощью .NET 6 (из новых шаблонов RC1), вы можете заметить, что чего-то не хватает. Класса Startup нет. Что случилось с этим? И как вы настраиваете свое новое веб-приложение .NET 6?

Шаблоны ASP.NET Core были обновлены для использования новейших функций языка C# и нового минимального API-интерфейса хостинга в .NET 6. Основной движущей силой этих изменений является простота. Команда ASP.NET хочет удалить ненужный код из вашего приложения, чтобы у вас было меньше кода, который нужно понимать и обрабатывать, а для новых разработчиков C# был более низкий порог входа. Они хотят предоставить «более сфокусированный и простой способ создания веб-приложения».

В приложении .NET 6 ваши службы и конфигурация ПО промежуточного слоя размещаются в файле Program.cs , а не делегируются отдельному классу Startup с его конструктором ConfigureServices и Configureметодами. Вот как выглядит исправленная версия Program.cs :

var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
   app.UseExceptionHandler("/Error");
   app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();

Первое, на что следует обратить внимание, это Mainотсутствие метода. В конце концов, это по-прежнему консольное приложение. Начиная с версии C# 9, представленной в прошлом году, этот Mainметод больше не нужен. Вместо этого в этом файле используется функция, называемая операторами верхнего уровня , где пространство имен, объявление класса и Mainметоды генерируются компилятором. Вы просто начинаете писать исполняемый код, который компилятор помещает в сгенерированный Mainметод.

В .NET 5 Program класс включает большое количество using директив независимо от того, нужны они или нет. В этой версии нет ни одного. В C# 10 представлена ​​новая функция, называемая глобальными использованиями , где предопределенный выбор using директив регистрируется глобально и больше не требуется в отдельных файлах классов. Выбор включает в себя все пространства имен, которые вы обычно видите в верхней части каждого файла класса в веб-приложении ASP.NET Core, поэтому эта новая функция значительно уменьшает шаблонный шум в вашей кодовой базе.

Глядя на сам код, он делает то же самое, что и класс Startup в .NET 5 и более ранних версиях. Код регистрирует сервисы и строит конвейер. Но это намного проще. Он использует новый минимальный API-интерфейс хостинга, основанный на новом WebApplicationBuilder типе, с помощью которого вы настраиваете свое приложение. Тип WebApplicationBuilderимеет ряд свойств, которые помогают упростить регистрацию и настройку службы:

  • Environment- обеспечивает доступ к IWebHostEnvironment
  • Services- то IServiceCollection , что было внедрено ConfigureServices в предыдущих версиях
  • Configuration- представляющий среди прочего IConfigurationвнедренный в старый Startup конструктор класса
  • Logging- включение конфигурации ведения журнала через ILoggingBuilder
  • Host- IHostBuilderкоторый позволяет настраивать специфичные для хоста службы, включая контейнеры DI сторонних производителей.
  • WebHost- IWebHostBuilderпредставленный webBuilderпараметр в ConfigureWebHostDefaults методе в версии .NET 3.1/5 Program.cs

Услуги добавляются к Servicesсвойству. В шаблоне проекта показано, как настроена Razor Pages:

var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorPages();

Вы используете Configurationсвойство для доступа IConfigurationк приложению, чтобы вы могли получить доступ к строкам подключения и т. д.:

builder.Services.AddDbContext<MyContext>(options =>
{
   options.UseSqlServer(builder.Configuration.GetConnectionString("MyContext"));
});

Метод Buildтипа WebApplicationBuilderвозвращает сконфигурированное приложение как новый WebApplicationтип. Представляет WebApplicationсобой слияние интерфейсов IApplicationBuilder, IEndpointRouteBuilderи IHost , с которыми мы знакомы по текущим версиям ASP.NET Core. Вы можете использовать существующие методы расширения IApplicationBuilderдля построения конвейера — UseStaticFilesи UseRoutingтак далее. И поскольку он реализует IEndpointRouteBuilder, больше не требуется вызывать лямбды MapRazorPages(или MapControllersт. д.). Вы можете вызвать это непосредственно WebApplication вместо этого.

Итак, большой вопрос: нужно ли обновлять код запуска, если вы переносите приложение .NET 5 Razor Pages, чтобы воспользоваться преимуществами долгосрочной поддержки, предоставляемой .NET 6? Ответ — нет. Общий подход к конфигурации приложения с двумя файлами по-прежнему поддерживается. Однако, если вы находитесь в процессе написания книги о Razor Pages, публикация которой запланирована после выпуска .NET 6, вам, возможно, придется просто переделать все примеры кода и обновить девять глав, написанных до сих пор, чтобы отразить новые способ ведения дел...

Последнее замечание: в файле csproj есть два новых параметра, которые определяют, как новые функции C# применяются к вашему приложению, — ImplicitUsingsи Nullable. Первый определяет, разрешено ли для проекта неявное или глобальное использование (по умолчанию enabled). Второй, Nullable, позволяет вам выбрать ссылочные типы, допускающие значение Null, которые были введены в C# 8 , чтобы помочь вам избежать ужасных ситуаций NullReferenceExceptionво время выполнения. По умолчанию также enabled. Основным последствием этого является то, что ваш проект может закончиться множеством новых предупреждений:

Резюме

Конфигурация веб-приложений в .NET 6 была упрощена до одного файла, чтобы уменьшить количество концепций для разработчиков, впервые использующих .NET. Введены два новых типа — the WebApplicationBuilderи WebApplication. Вам не нужно использовать этот шаблон. Существующий способ делать вещи, использующие класс Startup, по-прежнему поддерживается. Новые шаблоны проектов также содержат ряд новых функций C#.