Продолжим обзоры нововведений .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 можно найти по следующим ссылкам:
Кроме того, доступна следующая дополнительная информация: