Запуск Razor Pages в .NET 6
Когда вы создаете новое веб-приложение с помощью .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#.
Только полноправные пользователи могут оставлять комментарии. Аутентифицируйтесь пожалуйста, используя сервисы.