Не прошло и месяца с момента выхода предыдущей предварительной версии .NET 7, а уже стала доступна третья. Как всегда, одновременно обновились .NET 7, ASP.NET 7 и Entity Framework 7. В них были не только исправлены найденные ошибки, но и добавлены новые возможности, которые кратко рассмотрим далее. |
Для работы с .NET 7 Preview 3 рекомендуется использовать Visual Studio 17.2 Preview 3. Как и в случае с прошлыми предварительными версиями, Visual Studio for Mac пока не поддерживается.
Где скачать?
.NET 7 Preview 3
Native AOT
Функция предварительной компиляции (Ahead-Of-Time или AOT) не новинка для .NET. Она позволяет уменьшить время запуска приложений за счет компиляции в нативный код под заранее определенную ОС и архитектуру процессора. При этом сборки содержат по прежнему содержат байт-код, который позволяет запускать их и на любых других поддерживаемых платформах.
Native AOT генерирует для сборки только нативный код для заданной ОС и архитектуры процессора. Также оптимизируются структуры данных. В результате уменьшается размер самой сборки (а значит и занимаемый объем в памяти и на диске), ускоряется ее загрузка и запуск.
Однако, это приводит и к определенным ограничениям. Например, в процессе работы нельзя динамически загружать другие сборки или генерировать код.
Улучшение времени запуска
В новой версии .NET время запуска приложений с включенной политикой Write-Xor-Execute улучшено на 10-15%. Также разработчики утверждают, что эти изменений дали 8% прирост скорости в некоторых тестах даже с выключенной Write-Xor-Execute.
Write-Xor-Execute (иногда записывается как W^X) определяет что страница памяти может быть доступна для чтения/записи или чтения/выполнения, но не для записи/выполнения. Это позволяет предотвратить ряд атак, например таких как попытка переполнения буфера.
Поддержка OpenTelemetry
.NET 7 продолжает улучшать поддержку OpenTelemetry. В новой версии поддержаны изменения спецификации #988 и #1708, которые делают состояние TraceState доступным для изменений.
Кодогенерация
В .NET 7 Preview 3 содержит оптимизации и исправления ошибок в кодогенерации. Полный список доступен в официальном анонсе.
Регионы для управления памятью
Начиная с новой версии регионы (GC Regions) включены и используются по умолчанию для всех платформ кроме MacOS и Native AOT сборок. В дальнейшем планируется задействовать данную возможность и для них.
Новый класс для создания имен сертификатов
X500DistinguishedNameBuilder позволяет создавать имена сертификатов, автоматически экранируя специальные си��волы.
var builder = new X500DistinguishedNameBuilder();
builder.AddCommonName(name);
builder.AddOrganizationalUnitName("Dev");
builder.AddOrganizationName("Some Comapny");
request = new CertificateRequest(builder.Build(), …);
Критические изменения
Обновлен список критических изменений.
ASP.NET 7 Preview 3
Фильтры обработчиков в минимальных API
Фильтры обработчиков (route handler filters) выполняются до вызова самих обработчиков и могут изменять параметры или полностью перехватить обработку.
Новый метод AddFilter() позволяет задать фильтр тремя способами:
1) В виде обычного делегата:
app.MapGet("/users/{id}", (string id) => { … })
.AddFilter((context, next) =>
{
…
// Можно вернуть свой результат:
// return Result.Problem("Некорректный запрос");
// Или передать управление обработчику:
return next(context);
});
Обратите внимание, что context также может быть изменен.
2) Используя шаблон Фабрика, что позволяет получить доступ к метаданным запроса:
app.MapGet("/users/{id}", (string id) => { … })
.AddFilter((routeHandlerContext, next) =>
{
// Доступ к метаданным. Проверяем что параметр один и это строка.
var parameters = routeHandlerContext.GetParameters();
var isCorrectRequest = parameters.Length == 1 && parameters[0] is string;
return (context) =>
{
return isCorretRequest
? next(context)
: Result.Problem("Некорректный запрос");
}
});
3) Реализовав интерфейс IRouteHandlerFilter:
public class UserRouteHandlerFilter : IRouteHandlerFilter { … }
…
app.MapGet("/users/{id}", (string id) => { … })
.AddFilter();
Улучшения для тестирования кода
Классы .NET 7, реализующие IResult, теперь доступны публично. Все они оканчиваются на HttpResult (например OkObjectHttpResult, ProblemHttpResult). Это упрощает написание тестов для обработчиков запросов в минимальных API.
Использование TryParse() для получения данных в контроллерах
Модели, которые в контроллерах получают данные из запросов, могут поддержать свой механизм связывания с запросом (binding), реализовав один из следующих статических методов:
public static bool TryParse(string value, T out result);
public static bool TryParse(string value, IFormatProvider provider, T out result);
Здесь T это тип самой модели.
Другие улучшения
Вот какие еще были сделаны улучшения в ASP.NET
- Метод Results.Stream() получил перегрузки, которые позволяют его использовать в сценариях без буферизации.
- В EventSource добавлено событие ServerReady, сигнализирующее что сервер запущен и готов к работе.
- Производительность HTTP/2 в нагруженных сценариях была улучшена на 15%.
- Страница ошибки для разработчика получила поддержку темной темы.
Entity Framework Core 7 Preview 3
Третья предварительная версия Entity Framework Core добавляет возможность управлять тем, как EF7 создает классы в проектах на основе существующих баз данных (database first). Для этого используются шаблоны T4.
Для изучения новой возможности разработчики рекомендуют видео Database-first with T4 Templates in EF7: Early look.
Дополнительные ссылки
Полные описания возможностей новой версии можно найти по следующим ссылкам:
Кроме того, доступна следующая дополнительная информация: