На прошлой неделе вышла вторая предварительная версия .NET 7. Как обычно коротко пройдемся по её основным новинкам, включая ASP.NET 7 Preview 2. |
Для работы с .NET 7 Preview 2 рекомендуется использовать предварительные сборки Visual Studio 2022. А вот попробовать предварительную версию вместе Visual Studio for Mac не получится, как и в прошлый раз.
Где скачать?
.NET 7 Preview 2
Генератор исходного кода для RegEx (Regex Source Generator)
Использование генератора исходного кода позволяет оптимизировать работу RegEx в случае, когда регулярное выражение известно еще на этапе компиляции. Это приведет к минимизации времени его первого выполнения за счет предварительной компиляции. Выглядит это следующим образом:
public partial class InputValidator
{
[RegexGenerator(@"^\d+$", RegexOptions.IgnoreCase)]
public static partial Regex NumbersRegEx();
public bool Validate(string str)
{
return isMatch = NumbersRegEx().IsMatch(str));
}
}
Необходимо отметить, что для корректной работы генератора исходного кода сам класс, где используется регулярное выражение, должен быть создан как partial. Для получения оптимизированного экземпляра RegEx необходимо объявить частичный (partial) метод, отмеченный атрибутом [RegexGenerator], который содержит регулярное выражение.
CodeGen
Как и в прошлой предварительной версии, большое число изменений коснулись кодогенерации. Полный список можно посмотреть в официальном анонсе.
Улучшения SDK
- Команда donet new получила более однородный и интуитивный интерфейс. Кроме того, появилась возможность по нажатию Tab получить варианты продолжения команды (tab completion).
- Команды избавились от префикса "--", но он по-прежнему поддерживается для совместимости.
Критические изменения
Список критических изменений (Breaking changes in .NET 7) обновлен с выходом второй предварительной версии.
ASP.NET Core в .NET 7 Preview 2
Внедрение сервисов в Действия (Action)
В ASP.NET Core 7 больше не нужно отмечать сервисы, передаваемые в Действие, при помощи [FromServices]. Cам атрибут остался для совместимости с предыдущими версиями.
Приведенные ниже два объявления Действий идентичны с точки зрения внедрения сервиса:
public ActionResult GetUser([FromServices]UserService userService) { … }
public ActionResult GetUser(UserService userService) { … }
Отменить неявное поведение можно при помощи следующей настройки:
Services.Configure(options =>
{
options.DisableImplicitFromServicesParameters = true;
})
Внедрение зависимостей в методы SignalR Hub
Аналогичным образом можно внедрять сервисы в методы SignalR Hub. При этом атрибут [FromServices] также является опциональным.
public class NotificationsHub : Hub
{
public Task Update(string name, UserService userService) { … }
}
Как и в случае выше, неявное внедрение без атрибута может быть запрещено:
services.AddSignalR(options => {
options.DisableImplicitFromServicesParameters = true;
});
Описание конечной точки (endpoint) в минимальных API
Появилось два способа задать описание конечной точки, которое будет использоваться при генерации спецификации OpenAPI:
- Метод WithDescription(…) :
app.MapGet("/user", () => …).WithDescription("Описание для OpenAPI.");
- Атрибут [EndpointSummary]:
app.MapGet("/user", [EndpointSummary("Описание для OpenAPI.")]() => …);
Связывание (binding) массивов и строк с параметрами заголовка и запроса в минимальных API
.NET 7 позволяет с легкостью получать массивы примитивных типов, строк и StringValues из запросов и заголовков. Достатоно просто объявить массив как параметр:
// GET /names?id=1&id=2&id=3
app.MapGet("/names", (int[] id) { … }
Кроме того, можно использовать массивы любых типов, у которых определен метод TryParse(…):
app.MapGet("/names", (NameId[] id) { … });
…
pubic class NameId
{
public int? Id { get; init; }
public static bool TryParse(string? id, out NameId tag){ … }
}
Дополнительные ссылки
Полные описания нововведений можно найти по следующим ссылкам:
Кроме того, доступна следующая дополнительная информация: