День 1185. #ЧтоНовенького
Превью Обновлений ASP.NET Core в .NET 7
Вышло уже 3 превью новинок в ASP.NET Core в новой версии .NET 7, которая должна выйти в ноябре. Вот самое интересное, на мой взгляд.
1. Внедрение сервисов в методах контроллера
Теперь не обязательно использовать атрибут [FromServices], сервис будет подставляться автоматически:
public class MyController : ControllerBase
{
public ActionResult Get(MyService service) => Ok();
}
Это можно отключить в настройках:
Services.Configure<ApiBehaviorOptions>(opt =>
{
opt.DisableImplicitFromServicesParameters = true;
})
2. Описания конечных точек
В минимальных API теперь можно добавить аннотации для спецификаций OpenAPI. Либо через методы расширения:
app.MapGet("/hello", () => ...)
.WithDescription("Hello request");
Либо через атрибуты:
app.MapGet("/hello", [EndpointSummary("Hello request")]() => ...);
3. Привязка массивов и StringValues
Теперь можно выполнять связывание из заголовков HTTPS и строки запроса в массивы примитивных типов, строк или в StringValues:
// GET /tags?q=1&q=2
app.MapGet("/tags", (int[] q) => $"1:{q[0]}, 2:{q[1]}");
// GET /tags?names=john&names=jack
app.MapGet("/tags", (string[] names) => $"1:{names[0]}, 2:{names[1]}");
app.MapGet("/tags", (StringValues names) => $"1:{names[0]}, 2:{names[1]} ");
4. Фильтры обработчиков маршрутов
Фильтры выполняются перед основной логикой обработчика маршрута и могут использоваться для проверки и изменения параметров обработчика или перехвата выполнения обработчика.
app.MapGet("/hello/{name}", HelloName)
.AddFilter(async (сontext, next) =>
{
return await next(сontext);
});
Это похоже на фильтры промежуточного ПО. Но теперь их можно «навесить» на отдельные конечные точки.
Подробнее про них рассказывает Ник Чапсас https://youtu.be/Kt9TiXrwIp4
5. Привязка с использованием TryParse
Теперь вы можете привязывать значения параметров действия контроллера с помощью метода TryParse. В примере ниже контроллер привязывает данные из строки запроса с помощью метода TryParse в типе параметра:
public class TryParseController : ControllerBase
{
// GET /tryparse?data=MyName
[HttpGet]
public ActionResult Get([FromQuery]CustomParse data)
{
…
}
public class CustomParse
{
public string? Name { get; set; }
public static bool TryParse(string s, out CustomParse result)
{
if (s is null)
{
result = default;
return false;
}
result = new CustomParse { Name = s };
return true;
}
}
}
Источники:
- devblogs.microsoft.com/dotnet/…review-2
- devblogs.microsoft.com/dotnet/…review-3