Организуем Параметры Минимальных API
Несмотря на то, что эта функциональность была добавлена в .NET 7, я не писал о ней подробно, только пару слов про превью. Сегодня расскажу, что это.
Рассмотрим следующий минимальный API:
app.MapGet("ToDos", async (
ToDoDbContext dbContext,
string? tenantId,
int offset,
int limit,
ILogger<Program> logger) =>
{
logger.LogInformation(…);
var todos = await dbContext.ToDos
.Where(x => x.TenantId == tenantId)
.OrderBy(x => x.Id)
.Skip(offset)
.Take(limit)
.ToListAsync();
return TypedResults.Ok(todos);
});У нас несколько разнородных параметров, разбросанных по сигнатуре метода. В простом примере это не страшно, но может быстро перерасти в беспорядок. Мы можем использовать атрибут AsParameters, чтобы сгруппировать их вместе:
app.MapGet("ToDos/WithRequest", async ([AsParameters] GetRequest request) =>
{
…
});
record struct GetRequest(
ToDoDbContext DbContext,
int Offset,
int Limit,
[FromHeader(Name = "X-TenantId")]
string? TenantId,
ILogger<GetRequest> Logger);Здесь используется структура-запись (см. п.5 здесь), но классы также поддерживаются. Рекомендуется использовать структуру-запись, чтобы избежать дополнительного выделения памяти.
Кроме того, мы можем применять любые атрибуты привязки (FromHeader, FromQuery, FromServices и т. д.). В примере выше значение тенанта будет браться из заголовка запроса.
Источники:
- https://steven-giesel.com/blogPost/ee26a396-8f5a-40a7-9dd5-f08cd8c03518/organizing-parameters-in-minimal-api-with-the-asparametersattribute
- https://jaliyaudagedara.blogspot.com/2022/07/net-7-preview-5-using-asparameters.html