Andrey on .NET | .NET 7 Preview 1

.NET 7 Preview 1

.NET logoВроде бы только недавно вышла 6 версия .NET. И вот уже доступна для загрузки первая предварительная версия .NET 7. Коротко рассмотрим все новинки этой версии, а в завершении будут приведены ссылки на полные анонсы.

.NET 7 будет "текущей" (current) версией. Это значит что поддержка финальной версии продлится 18 месяцев после даты её выхода.

Для работы с .NET 7 Preview 1 рекомендуется использовать Visual Studio 2022 7.2 Preview 1 или более новую версию. Поддержка .NET 7 в Visual Studio for Mac в данный момент отсутствует.

Где скачать?

.NET 7 Preview 1

.NET 7 как целевая платформа (target framework)

Для того, чтобы проект был нацелен на использование .NET 7 необходимо указать соответствующее значение TargetFramework в его настройках:

<TargetFramework>net7.0</TargetFramework>

Кроме того, определены TargetFramework, для конкретных операционных систем:

  • net7.0-android
  • net7.0-ios
  • net7.0-maccatalyst
  • net7.0-macos
  • net7.0-tvos
  • net7.0-windows

Поддержка ссылочных типов, допускающих значение null, в библиотеках Microsoft.Extensions.*

Аннотации для поддержки ссылочных типов, допускающих значение null, были добавлены в следующие библиотеки:

  • Microsoft.Extensions.DependencyInjection.Abstractions
  • Microsoft.Extensions.Logging.Abstractions
  • Microsoft.Extensions.Primitives
  • Microsoft.Extensions.FileSystemGlobbing
  • Microsoft.Extensions.DependencyModel
  • Microsoft.Extensions.Configuration.Abstractions
  • Microsoft.Extensions.FileProviders.Abstractions
  • Microsoft.Extensions.FileProviders.Physical
  • Microsoft.Extensions.Configuration
  • Microsoft.Extensions.Configuration.Binder
  • Microsoft.Extensions.Configuration.CommandLine
  • Microsoft.Extensions.Configuration.EnvironmentVariables
  • Microsoft.Extensions.Configuration.FileExtensions
  • Microsoft.Extensions.Configuration.Ini
  • Microsoft.Extensions.Configuration.Json

Изменения в ActivityContext

  • Появилась перегрузка для ActivityContext.TryParse(…), которая позволяет создавать ActivityContext с использованием контекста, полученного с удаленного родителя.
  • Добавлен метод Activity.IsStopped() позволяет определить остановлен ли данный объект Activity.

Изменения в System.Text.Json

  • Предоставлен доступ к экземпляру JsonSerializerOptions, используемому по-умолчанию.
  • Добавлено свойство JsonWriterOptions.MaxDepth.
  • В System.Net.Http.Json до��авлена поддержка PATCH (метод PatchAsJsonAsync(…)).

CodeGen

В .NET 7 Preview 1 вошло достаточно много изменений кодогенерации, полный список которых доступен в полном анонсе.

p/Invoke

p/Invoke это технология для обращения к неуправляемому коду из управляемого. В .NET 7 Preview 1 появился генератор p/Invoke кода: для методов, которые отмечены атрибутом [LibraryImport] и используются для вызова методов из неуправляемого кода, необходимый p/Invoke код будет создан автоматически.

[LibraryImport("NativeBinary")]
internal static partial int Sum(int a, int b);

Кроме того, разработчики .NET обещают что данная функциональность будет доступна в виде отдельного инструмента вне .NET 7.

Улучшения горячей перезагрузки кода (hot reload)

Теперь поддерживается горячая перезагрузка кода в следующих сценариях:

  • добавление статической лямбды в существующий метода;
  • добавление лямбды, захватывающей существующий метод, который захвачен хотя бы одной уже существующей лямбдой;
  • добавление статических или не виртуальных методов в существующий класс;
  • добавление статических полей в существующий класс;
  • добавление новых классов.

ASP.NET Core в .NET 7 Preview 1

Улучшения Minimal API

Для работы с загруженными файлами в .NET 7 появились интерфейсы IFormFile и IFormFileCollection:

app.MapPost("/upload", async(IFormFile file) =>
{
    using var stream = File.OpenWrite("upload.txt");
    await file.CopyToAsync(stream); 
});

app.MapPost("/upload", async (IFormFileCollection myFiles) => { … });

Тело запроса можно получить как Stream или PipeReader:

app.MapPost("/add", async (Stream body, CancellationToken ct) => { … });

Стоит учесть, что полученный Stream можно прочитать только один раз (без перемотки назад) и он доступен только в теле обработчика Minimal API.

Для настройки JSON в Minimal API добавлен метод ConfigureRouteHandlerJsonOptions(…).

builder.Services.ConfigureRouteHandlerJsonOptions(options => {…});

SignalR

В SignalR появился генератор для создания клиентского C# кода на основе интерфейсов хабов.

MVC и Razor Pages

  • Представления MVC и Razor Pages теперь поддерживают ссылочные типы, допускающие значение null, в качестве моделей страниц.
  • Теперь в ModelErrorDictionary  могут быть добавлены имена свойств JSON объекта при ошибки валидации:
services.AddControllers(options =>
{
    options.ModelMetadataDetailsProviders.Add(new SystemTextJsonValidationMetadataProvider())
});

dotnet watch

  • dotnet watch теперь использует эмоджи при выводе на консоль.
  • dotnet watch можно настроить на автоматический перезапуск если после изменения кода невозможно применить горячую перезагрузку (hot reload). Для этого нужно установить переменную среды DOTNET_WATCH_RESTART_ON_RUDE_EDIT в значение true.

Blazor

В Blazor в атрибутах валидации можно получить необходимые сервисы используя ValidationContext.GetRequiredService<TService>().

HTTP, HTTP/2 и HTTP/3

Оптимизирована скорость обработки и записи заголовков.

gRPC

Сервис перекодирования gRPC JSON позволяет обращаться к gRPC сервису используя стандартные HTTP запросы. Подробности и примеры можно посмотреть на GitHub.

Entity Framework Core 7 Preview 1

В Entity Framework Core 7 Preview 1 исправлено более 80 известных проблем. О каких-то новых возможностях разработчики не сообщают.

Ссылки

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

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

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