Andrey on .NET | .NET 7 Preview 7

.NET 7 Preview 7

.NET logoПродолжим обзоры нововведений .NET 7. В этот раз стала доступна 7 предварительная версия. Кратко рассмотрим, что нового появилось в ней, а также в ASP.NET Core и Entity Framework.

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

Где скачать?

 

.NET 7 Preview 7

Упрощение сортировки в LINQ

В LINQ добавлены перегрузки без параметров для методов Order() и OrderDescending(). Они возвращают отсортированное перечисление, сравнивая сами объекты. Это упростит код, например, при использовании примитивных типов и записей (record):

var regions = new [] { 1, 15, 3, 42, 28 };
var sortedRegions = regions.Order();

Поддержка прав доступа в Unix

В .NET 7 Preview 7 добавлено перечисление UnixFileMode, описывающее режимы доступа к файлам и директориям в Unix. Также для работы с ними API претерпел следующие изменения:

  • Метод Directory.CreateDirectory(…) получил перегрузку, которая принимает параметр типа UnixFileMode.
  • Класс FileStreamOptions обзавелся свойством данного типа.
  • В класс File добавлены два статических метода: File.GetUnixFileMode(…) и File.SetUnixFileMode(…).

Поддержка ref в ref struct

Структуры ref struct теперь могут содержать ref поля. Как следствие этого, такие классы как Span<T> могут быть реализованы непосредственно на C#.

Кодогенератор [LibraryImport]

[LibraryImport] этого генератор кода для обращения к нативным методам платформы, который имеет больше возможностей по сравнению с непосредственным использованием [DllImport]. Он позволяет передавать в вызовы параметры как стандартных, так и пользовательских типов.

Также добавлен анализатор кода для конвертации существующих [DllImport] в [LibraryImport].

Улучшения ClientWebSocket

ClientWebSocket теперь поддерживает заголовки в upgrade ответах.

Кодогенерация

В .NET 7 Preview 7 содержится ряд исправлений ошибок и улучшений кодогенерации. По��ный список можно посмотреть в официальном анонсе.

Критические изменения

Начиная с Preview 7 для консольных приложений, публикуемых с настройкой PublishTrimmed=true, по умолчанию используется <TrimMode>Full</TrimMode> для уменьшения размеров исполняемого файла. Исключением являются проекты, использующие следующие SDK: Windows Desktop, Android, iOS, WASM, ASP.NET.

По прежнему доступен полный список критических изменений.

 

ASP.NET 7 Preview 7

Поддержка аутентификации при загрузке файлов в Minimal API

ASP.NET 7 Preview 7 разрешает использовать IFormFile и IFormFileCollection в запросах, требующих аутентификацию. Для большей безопасности рекомендуется использовать сервис IAntiforgery для проверки запроса.

IProblemDetailsService

Новый сервис IProblemDetailsService позволяет различным middleware генерировать консистентные ответы, содержащие описание ошибки в формате ProblemDetails.

Для его использования необходимо добавить данный сервис в приложение:

builder.Services.AddProblemDetails();

После этого код middleware для генерации ответа с ProblemDetails может выглядеть так:

httpContext.Response.StatusCode = StatusCodes.Status400BadRequest;

if (context.RequestServices.GetService<IProblemDetailsService>() is { } problemDetailsService)
    return problemDetailsService.WriteAsync(new { HttpContext = httpContext });

return ValueTask.CompletedTask;

Формат ответа можно настраивать двумя способами. Первый – использовать опции при добавлении сервиса в приложение:

builder.Services.AddProblemDetails(options =>
{
    options.CustomizeProblemDetails = (context) =>
    {
       context.ProblemDetails.Extensions.Add("defined-extension", new { Property = "ext-value" });
    };
});

Второй вариант более гибкий – написать свои реализации интерфейса IProblemDetailsWriter, который включает в себя следующие методы:

  • bool CanWrite(ProblemDetailsContext context) – определяет может ли данная реализация создать ответ для текущего контекста (например, в зависимости от возвращаемого HTTP кода).
  • Task WriteAsync(ProblemDetailsContext context) – метод ответственный за создание ответа.

При этом созданные классы необходимо добавить в приложение до вызова AddProblemDetails().

Улучшение диагностики

Следующие middleware будут возвращать ответ содержащий ProblemDetails, если был зарегистрирован сервис IProblemDetailsService:

  • ExceptionHandlerMiddleware
  • StatusCodePagesMiddleware
  • DeveloperExceptionPageMiddleware

Новые интерфейсы результатов обработчика запроса

Добавлены следующие интерфейсы, наследующиеся от IResult и указывающие на специфику ответа:

  • IContentTypeHttpResult
  • IFileHttpResult
  • INestedHttpResult
  • IStatusCodeHttpResult
  • IValueHttpResult
  • IValueHttpResult<TValue>

Это позволяет удобнее анализировать ответ в фильтрах и тестах.

Обновлены шаблоны приложений

Шаблон Angular приложения теперь использует Angular 14, а React приложения – React 18.2.

Улучшение транскодирования gRPC JSON

Согласно тестам разработчиков .NET, скорость преобразования gRPC запроса в JSON (как и обратный процесс) увеличилась примерно в 2 раза. Кроме того, существенно уменьшено выделение памяти при данной операции.

Упрощение использования аутентификации

Если веб-приложение использует только одну схему аутентификации, то она будет использована при указании DefaultScheme в методе AddAuthentication(). Отменить это поведение можно следующим вызовом:

AppContext.SetSwitch("Microsoft.AspNetCore.Authentication.SuppressAutoDefaultScheme");

Страница загрузки Blazor приложения

В шаблоне "Blazor WebAssembly" добавлены две CSS переменные для настройки стиля отображения загрузки приложения:

  • --blazor-load-percentage – процент загрузки приложения.
  • --blazor-load-percentage-text – текст.

Улучшения привязки данных (data binding) в Blazor

  • Новый модификатор @bind:after позволяет запускать асинхронный код после завершения привязки данных.
  • Для упрощения двунаправленной привязки добавлены модификаторы @bind:get и @bind:set.

Улучшение компонента Virtualize

До ASP.NET 7 Preview 7 компонент Virtualize использовал тег <div> для создания своей рабочей области. Это не всегда было удобно или даже приемлемо. Теперь можно задать нужный тег, используя свойство SpacerElement.

Передача состояния при навигации

NavigationManager.NavigateTo(…) теперь позволяет передавать объект с состоянием, используя свойство HistoryEntryState параметра типа NavigationOptions. В дальнейшем доступ к нему можно получить при помощи NavigationManager.HistoryEntryState и LocationChangedEventArgs.HistoryEntryState.

Поддержка алгоритмов шифрования в Web Assembly

Добавлена поддержка следующих алгоритмов:

  • SHA1, SHA256, SHA384, SHA512
  • HMACSHA1, HMACSHA256, HMACSHA384, HMACSHA512
  • Aes (но только CBC)
  • Rfc2898DeriveBytes (PBKDF2)
  • HKDF

 

Entity Framework 7 Preview 7

Основным нововведением Entity Framework 7 Preview 7 является добавление ряда новых и доработка существовавших перехватчиков (interceptor). Как следует из названия, они позволяют перехватывать определенные операции, производимые Entity Framework, и влиять:

  • На материализацию, т. е. создание сущностей и заполнение их данными (IMaterializationInterceptor).
  • На деревья LINQ выражений до их компиляции (IQueryExpressionInterceptor).
  • На обработку оптимистической блокировки (optimistic concurrency) (ISaveChangesInterceptor).
  • На cоединение с базой данных до момента проверки наличия строки соединения (IDbConnectionInterceptor).
  • На данные, которые были получены из result set, причем до момента, когда этот result set будет закрыт (IDbConnectionInterceptor).
  • На создание DbConnection (IDbConnectionInterceptor).
  • На выполнение DbCommand после её инициализации (IDbCommandInterceptor).

Также можно подписаться на события:

  • Перед тем, как состояние сущности (tracked, changed) будет изменено (ChangeTracker.StateChanged).
  • Перед и после того, как Entity Framework определяет изменение данных в сущностях (ChangeTracker.DetectChanges).

Для использования перехватчиков необходимо написать реализацию соответствующего интерфейса. После чего, в методе DbContext.OnConfiguring(…) добавить её в контекст, вызвав метод AddInterceptors(…) у переданного optionBuilder.

Кроме того, в новой версии можно найти ряд небольших изменений, таких как поддержку string.Join(…) и string.Concat(…) при трансляции выражений, возможность использовать однонаправленные отношения многие-ко-многим и ряд других.

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

Официальные анонсы от Microsoft можно найти по следующим ссылкам:

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

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