1. Основы ASP.NET Core: проект, middleware, DI и конфигурация
Основы ASP.NET Core: проект, middleware, DI и конфигурация
ASP.NET Core — это кроссплатформенный фреймворк для создания веб-приложений. В этом курсе мы будем строить Web API, MVC-приложения и страницы Razor, но в основе у них одни и те же фундаментальные механизмы:
Эта статья задаёт базу, на которую мы будем опираться во всех последующих темах.
Что создаёт шаблон ASP.NET Core и как он запускается
Современные версии ASP.NET Core используют minimal hosting model: в проекте обычно есть один главный файл Program.cs, в котором настраивается приложение.
Типичный Program.cs выглядит так:
Что здесь происходит:
WebApplication.CreateBuilder(args) создаёт объект builder и поднимает базовую инфраструктуру: DI-контейнер, конфигурацию, логирование, информацию об окружении.builder.Services — коллекция сервисов, которые попадут в DI-контейнер.builder.Build() собирает приложение.app.Use... и app.Map... формируют конвейер обработки запросов.app.Run() запускает веб-сервер и начинает принимать HTTP-запросы.Официальные основы: ASP.NET Core fundamentals overview.
Структура проекта: что важно понимать сразу
Структура может немного отличаться по шаблонам (Web API, MVC), но ключевые элементы похожи:
Program.cs — точка входа и настройка приложения.Properties/launchSettings.json — профили запуска (порт, переменные окружения для локального старта).appsettings.json — базовые настройки.appsettings.{Environment}.json — настройки для конкретного окружения.Controllers — контроллеры (для Web API и MVC).Views — представления (для MVC).Pages — Razor Pages.Важно: контроллеры, Razor Pages и MVC — это надстройки, которые «подключаются» через DI и middleware. Поэтому сначала мы разбираем фундамент.
Hosting и окружения
ASP.NET Core различает окружения (например, Development, Staging, Production). Окружение влияет на:
Проверять окружение можно так:
app.Environment — это сервис, доступный приложению из коробки.
Middleware: конвейер обработки HTTP-запроса
Middleware — это компонент, который получает HttpContext и либо:
Запрос проходит через цепочку middleware в порядке регистрации.
!Диаграмма показывает, как запрос проходит через middleware и как ответ возвращается обратно
Базовые методы: Use, Run, Map
app.Use(...) добавляет middleware, которое обычно вызывает следующий компонент через next().app.Run(...) добавляет терминальный middleware: после него цепочка не продолжается.app.Map(...) создаёт ветвление конвейера по пути (например, отдельная ветка для /admin).Пример простого middleware, добавляющего заголовок:
Порядок middleware имеет значение
Некоторые компоненты обязаны стоять в определённом порядке. Типичный пример для приложений с маршрутизацией и авторизацией:
Причина проста:
Официальная документация: ASP.NET Core middleware.
Endpoint routing: MapControllers и MapGet
В ASP.NET Core конечные точки (endpoints) регистрируются через Map....
app.MapControllers() подключает атрибутную маршрутизацию контроллеров.app.MapGet(...), app.MapPost(...) и другие методы создают минимальные endpoint’ы.Пример minimal endpoint:
В следующих статьях мы будем подробно сравнивать Web API (контроллеры) и минимальные API, но фундамент (routing + middleware) общий.
Dependency Injection: внедрение зависимостей в ASP.NET Core
DI (Dependency Injection) — это способ передавать объекту его зависимости извне, вместо того чтобы создавать их внутри. ASP.NET Core использует встроенный DI-контейнер.
Ключевые роли:
IWeatherService)WeatherService)!Иллюстрация показывает, как DI-контейнер создаёт объекты и внедряет их в контроллер
Регистрация сервисов
Сервисы регистрируются в builder.Services:
Далее их можно получить через конструктор контроллера (или другого сервиса):
Время жизни сервисов (lifetimes)
ASP.NET Core поддерживает три основных времени жизни:
AddSingleton — один экземпляр на всё приложение (создаётся один раз и переиспользуется).AddScoped — один экземпляр на HTTP-запрос.AddTransient — новый экземпляр при каждом запросе к сервису.Практические ориентиры:
Официальная документация: Dependency injection in ASP.NET Core.
Распространённые ошибки DI
Singleton, если он внутри использует Scoped (часто приводит к ошибкам времени жизни и непредсказуемому состоянию).new вместо регистрации в DI (ломает тестируемость и единый жизненный цикл).Конфигурация: appsettings, переменные окружения, user secrets
ASP.NET Core собирает конфигурацию из нескольких источников (providers). Обычно используются:
appsettings.jsonappsettings.{Environment}.jsonВажно: источники накладываются друг на друга. Если ключ встречается несколько раз, обычно побеждает источник, добавленный позже.
!Диаграмма показывает приоритет источников конфигурации
Официальная документация: Configuration in ASP.NET Core.
Пример appsettings.json
Чтение значения напрямую:
Options pattern: типобезопасные настройки
Чаще настройки привязывают к классу — так безопаснее и удобнее.
Класс настроек:
Регистрация:
Использование через IOptions<T>:
Официальная документация: Options pattern in ASP.NET Core.
Где хранить секреты
Для разработки используйте User Secrets, чтобы не коммитить ключи в репозиторий. Для продакшена — переменные окружения или менеджеры секретов инфраструктуры.
Документация: Safe storage of app secrets in development in ASP.NET Core.
Сводка: что вы должны уметь после этой статьи
Program.cs, builder и app.Use, Run, Map и понимать, почему порядок важен.Singleton/Scoped/Transient).appsettings и использовать Options pattern.В следующих материалах мы начнём применять эти основы на практике: построим первые Web API endpoints, подключим контроллеры, научимся возвращать корректные HTTP-ответы и подготовим структуру для расширяемого приложения.