.NET 6: Минималистические API
В Microsoft всерьёз озаботились слишком высоким порогом входа в ASP.NET, по сравнению с другими фреймворками. Проблема в том, что минимальный проект API или веб-сайта в ASP.NET содержит с десяток файлов и папок: файлы конфигурации,
Startup.cs и т.п. А кто знает точно, что вообще происходит в файлах Program.cs и Startup.cs? Зачем там весь этот код?В итоге в Microsoft пришли к следующему коду в файле
Program.cs:var app = WebApplication.Create(args);Помимо этого, конечно, нужны классы домена и контекста
app.Map("/", () => "Hello World");
app.MapGet("/todos", async () =>
{
using var db = new TodoDbContext();
return await db.Todos.ToListAsync();
});
app.MapPost("/todos", async (Todo todo) =>
{
using var db = new TodoDbContext();
await db.Todos.AddAsync(todo);
await db.SaveChangesAsync();
});
app.Run();
TodoDbContext. И понадобится ещё файл Imports.cs, где будут находиться все директивы using, используемые в приложении (их теперь, чтоб не писать в каждом файле, можно подключить глобально через global using …, по аналогии с файлом ViewImports).И всё! Вот полноценное рабочее веб-API приложение (можно дальше добавлять
MapDelete, MapPatch и т.п.). Как вам?Никаких
CreateHostBuilder, UseStartup, Configure и ConfigureServices, папки контроллеров и прочего шаблонного кода. Все настройки по умолчанию собраны в WebApplication.Create, а дальше вы просто сопоставляете путь с функцией обработчиком, и вуаля! На мой взгляд, это великолепное нововведение! Как объясняют создатели (ссылка на полное видео внизу), это позволит новичкам не погружаться сразу в бессмысленный набор файлов, а начать с самого простого. Один файл. Задаёшь путь и нужный вывод (см. "Hello World" выше), переходишь по этому пути, и получаешь результат!
При этом самое главное, что это не обязаловка. Нынешний хорошо структурированный расклад не только продолжит существовать, но также будут добавлены все возможные вариации между ним и этим однофайловым кодом. То есть, вместо
WebApplication.Create вы можете создать построитель, и внедрить нужные зависимости:var builder = WebApplication.CreateBuilder(args);Далее можно более детально настроить хост, добавить необходимые сервисы. Затем можно выделить настройку сервисов в файл Startup, а сопоставление путей с методами в отдельный файл, а дальше разделить на контроллеры. То есть обучение технологии теперь будет проходить более естественно. Не начиная с многостраничного объяснения, что, где и зачем лежит. Теперь можно начать с элементарного рабочего кода, а дальше (при необходимости) выделять обособленные части в отдельные файлы и постепенно перейти к той структуре, которая нам всем известна.
builder.Services
.AddDbContext<TodoDbContext>(o =>
o.UseSqlite("DataSource=Todos.db"));
var app = builder.Build();
Ну и конечно, такой подход сильно поможет в создании микросервисов, когда нужен самый простой код, «без ансамбля». Помимо прочего, судя по первым тестам, он работает на 30-50% быстрее стандартного приложения из-за избавления от всего ненужного функционала.
Источник: https://youtu.be/enAskgcF0c0