Andrey on .NET | .NET 7 Preview 3

.NET 7 Preview 3

.NET logoНе прошло и месяца с момента выхода предыдущей предварительной версии .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.

Дополнительные ссылки

Полные описания возможностей новой версии можно найти по следующим ссылкам:

Кроме того, доступна следующая дополнительная информация:

Добавить комментарий