.NET 7 Preview 7
Продолжим обзоры нововведений .NET 7. В этот раз стала доступна 7 предварительная версия. Кратко рассмотрим, что нового появилось в ней, а также в ASP.NET Core и Entity Framework.
Для работы с .NET 7 Preview 7 рекомендуется использовать Visual Studio 17.4 Preview 1 или последнюю предварительную версию Visual Studio for Mac.
Где скачать?
- [SDK и Runtime для Windows, MacOS и Linux](https://dotnet.microsoft.com/download/dotnet/7.0)
- [Container images](https://hub.docker.com/_/microsoft-dotnet)
- [Linux packages](https://github.com/dotnet/core/blob/master/release-notes/7.0/)
.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 могут быть реализованы непосредственно на C#.
Кодогенератор [LibraryImport]
[LibraryImport] этого генератор кода для обращения к нативным методам платформы, который имеет больше возможностей по сравнению с непосредственным использованием [DllImport]. Он позволяет передавать в вызовы параметры как стандартных, так и пользовательских типов.
Также добавлен анализатор кода для конвертации существующих [DllImport] в [LibraryImport].
Улучшения ClientWebSocket
ClientWebSocket теперь поддерживает заголовки в upgrade ответах.
Кодогенерация
В .NET 7 Preview 7 содержится ряд исправлений ошибок и улучшений кодогенерации. Полный список можно посмотреть в официальном анонсе.
Критические изменения
Начиная с Preview 7 для консольных приложений, публикуемых с настройкой PublishTrimmed=true, по умолчанию используется Full для уменьшения размеров исполняемого файла. Исключением являются проекты, использующие следующие 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:
ExceptionHandlerMiddlewareStatusCodePagesMiddlewareDeveloperExceptionPageMiddleware
Новые интерфейсы результатов обработчика запроса
Добавлены следующие интерфейсы, наследующиеся от IResult и указывающие на специфику ответа:
IContentTypeHttpResultIFileHttpResultINestedHttpResultIStatusCodeHttpResultIValueHttpResultIValueHttpResult
Это позволяет удобнее анализировать ответ в фильтрах и тестах.
Обновлены шаблоны приложений
Шаблон 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 использовал тег “ для создания своей рабочей области. Это не всегда было удобно или даже приемлемо. Теперь можно задать нужный тег, используя свойство 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 можно найти по следующим ссылкам:
- Announcing .NET 7 Preview 7
- ASP.NET Core updates in .NET 7 Preview 7
- Announcing Entity Framework 7 Preview 7
Кроме того, доступна следующая дополнительная информация: