.NET Разработчик
6.52K subscribers
441 photos
3 videos
14 files
2.12K links
Дневник сертифицированного .NET разработчика. Заметки, советы, новости из мира .NET и C#.

Для связи: @SBenzenko

Поддержать канал:
- https://boosty.to/netdeveloperdiary
- https://patreon.com/user?u=52551826
- https://pay.cloudtips.ru/p/70df3b3b
Download Telegram
День семьсот сорок первый. #ЗаметкиНаПолях #Blazor
10 Функций
Blazor, о Которых Вы Вероятно не Знали. Начало
Хотя Blazor приобрел значительную популярность в последние месяцы, до сих пор существует много неправильных представлений о том, на что он способен. В этой серии постов мы рассмотрим некоторые из неочевидных, но не менее важных функций платформы Blazor.

1. Blazor может делать все, что могут делать HTML и CSS
Один из часто задаваемых вопросов при работе Blazor, касается использования какой-либо структуры пользовательского интерфейса, библиотеки CSS или конкретной функции CSS. Ответ однозначный: ДА, вы можете это использовать. Хотя Blazor использует шаблоны Razor для создания компонентов, результатом является HTML-код, отображаемый в браузере. HTML и CSS, сгенерированные Blazor, ничем не отличаются от любого другого HTML или CSS для браузера. Это означает, что весь допустимый HTML и CSS действителен в приложении Blazor. То есть вы можете использовать все функции CSS, включая медиа-запросы для адаптивного дизайна, настраиваемые свойства (переменные) CSS и даже препроцессоры, такие как Sass.

Компоненты формы
Blazor имеет дополнительные функции, помогающие с генерацией HTML, такие как встроенные компоненты Form и Input. Это необязательные компоненты, которые абстрагируют распространённую задачу создания формы с проверкой. В итоге компоненты отображают стандартный HTML. Эти компоненты могут полноценно использовать стандартные атрибуты HTML, такие как class, id и aria-.

Изоляция CSS
Blazor имеет встроенную изоляцию CSS, которая помогает избежать конфликтов стилей между компонентами и библиотеками. Изоляция CSS создаётся во время сборки. В это время Blazor добавляет уникальный идентификатор к селекторам CSS, которые соответствуют атрибуту HTML в разметке, отображаемой компонентом.

Эта функция использует атрибуты CSS и HTML, которые являются стандартными веб-технологиями и изначально понимаются браузером. Результатом являются селекторы CSS с высоким уровнем специфичности, которые нельзя изменить обычным каскадированием CSS (см. рисунок ниже).

2. Blazor может делать все, что умеет JavaScript
Тот факт, что Blazor использует .NET и WebAssembly, не означает, что он ограничен при работе с браузером. Платформа Blazor упрощает выполнение распространённых задач, таких как работа с DOM (рендеринг компоненты и HTML), выборка данных по HTTP и маршрутизация на стороне клиента. Хотя Blazor работает на платформах .NET и WebAssembly, он ими не ограничивается. Blazor также имеет полный доступ к API-интерфейсам JavaScript браузера благодаря взаимодействию с JavaScript (JS interop). Приложение Blazor может вызывать функции JavaScript из методов .NET и методы .NET из функций JavaScript. Взаимодействие с JavaScript используется, когда в платформе Blazor отсутствует API или компонент для желаемой функции, или когда разработчики хотели бы использовать экосистему JavaScript.

Blazor не умеет делать то, чего не умеет JavaScript
Веб-стандарты и возможности браузера эволюционировали в многофункциональную и безопасную среду. Стандартные веб-технологии, такие как WebAssembly, не только позволяют работать Blazor, но и ограничивают его теми же критериями, что и JavaScript. Просто тот факт, что Blazor работает на .NET и WebAssembly, не предоставляет ему особых возможностей, выходящих за пределы изолированной песочницы браузера (JavaScript). Это означает, что код Blazor и .NET не может читать реестр, определять текущего пользователя Windows или получать доступ к учетным записям Outlook.

Продолжение следует…

Источник:
https://www.telerik.com/blogs/10-blazor-features-you-probably-didnt-know
День семьсот сорок второй. #ЗаметкиНаПолях #Blazor
10 Функций
Blazor, о Которых Вы Вероятно не Знали. Продолжение
Начало

3. Объединение MVC и Blazor в одном проекте
Есть ли способ использовать MVC и Blazor (на стороне клиента) в одном проекте?

Если вы уже работаете над приложением ASP.NET Core MVC или Razor Pages, вы всё равно можете использовать Blazor. Поскольку Blazor является частью ASP.NET Core, он довольно хорошо интегрируется с существующими приложениями. Он может как предоставить путь миграции к Blazor, так и просто добавить дополнительную гибкость вашей кодовой базе. Чтобы использовать эту функцию воспользуйтесь тег-хелпером component для рендеринга желаемого компонента в приложении MVC:
<component type="typeof(MyComponent)" render-mode="ServerPrerendered" param-Name="Value" />
В этом видео обсуждается тег-хелпер component и использование его с Blazor.

Пре-рендеринг и аутентификация
Вы можете использовать Blazor не только в приложении MVC или Razor Pages, но для серверного пре-рендеринга, а также аутентификации через Microsoft Identity. При использовании Blazor Server или Blazor WebAssembly с включенным пре-рендерингом приложение будет использовать страницы Blazor для начальной загрузки приложения. В типичном приложении Blazor Server файл _host.cshtml инициализирует клиента Blazor с помощью тег-хелпера component:
<component type="typeof(App)" render-mode="ServerPrerendered" />
Также страницы аутентификации Identity пишутся в cshtml и генерируются на сервере даже в приложении Blazor.

4. SignalR без JavaScript
Когда Blazor был впервые выпущен, SignalR можно было использовать только через библиотеки JavaScript. Теперь у Blazor есть пакет NuGet, который включает SignalR без использования JavaScript. Пакет Microsoft.AspNetCore.SignalR.Client - это всё, что вам нужно для подключения приложения Blazor к хабу SignalR, и самое главное, вы можете сделать всё это на C#. С помощью класса SignalR HubConnection приложение Blazor может подключаться к хабу, отправлять и получать команды:
// создание подключения
var hubConnection = new HubConnectionBuilder()
.WithUrl(NavigationManager.ToAbsoluteUri("/chathub"))
.Build();

// запуск
await hubConnection.StartAsync();
// действие при получении команды
hubConnection.On<string, string>(
"ReceiveMessage", (user, message) => {
var encodedMsg = $"{user}: {message}";
messages.Add(new Message
{ Text = encodedMsg });
});

// вызываем хаб
Task Send() => hubConnection
.SendAsync("SendMessage",
userInput, messageInput);

С помощью всего нескольких строк кода можно создать приложение чата в реальном времени с использованием ASP.NET Core и Blazor WebAssembly.

Продолжение следует…

Источник:
https://www.telerik.com/blogs/10-blazor-features-you-probably-didnt-know
День семьсот сорок четвёртый. #ЗаметкиНаПолях #Blazor
10 Функций
Blazor, о Которых Вы Вероятно не Знали. Продолжение
Начало 1-2
Продолжение 3-4

5. gRPC и Protobuf
.NET полностью поддерживает gRPC, современную высокопроизводительную среду для удалённого вызова процедур с открытым исходным кодом. С выпуском .NET 5.0 и ASP.NET Core, и Blazor получили интегрированную поддержку gRPC. Поддержка включает библиотеку для создания сервера gRPC в ASP.NET и клиента gRPC в Blazor WebAssembly. Приложения gRPC обмениваются данными между клиентом и службой через бинарный канал. Инструментарий автоматически генерирует частичные классы .NET из файлов protobuf (.proto), которые представляют конкретных клиентов и службы (см. рисунок ниже). Использование частичных классов помогает разработчикам легко их расширять при необходимости.

Клиент gRPC создаётся с использованием канала, который представляет собой долгоживущее соединение с сервисом gRPC. Канал разрешается посредством внедрения зависимостей с использованием объекта GrpcChannel.
@inject GrpcChannel Channel
<SampleGrid Data="forecasts" AutoGenerateColumns="true"></SampleGrid>

@code {
private IList<WeatherForecast>? forecasts;
protected override async Task
OnInitializedAsync() {
// Создаём клиента канала
var client = new WeatherForecasts
.WeatherForecastsClient(Channel);

// Вызываем метод GetWeatherForecast
var emptyRequest = new Google
.Protobuf.WellKnownTypes.Empty();
var response = await client
.GetWeatherForecastsAsync(emptyRequest);
forecasts = response.Forecasts;
}
}
Этот новый протокол позволяет разработчикам выбирать между REST API c JSON, веб-сокетами с SignalR и передачей двоичных данных с использованием gRPC.

6. Используйте уже существующие библиотеки .NET
Есть большая вероятность, что существующий код .NET будет работать в Blazor без каких-либо изменений. Поскольку Blazor выполняет стандартный код .NET, это означает, что ваше приложение может использовать библиотеки DLL .NET и пакеты NuGet, которые были написаны до выпуска Blazor. Библиотеки, которые поддерживают .NET Standard или .NET Core и не ориентированы на API-интерфейсы конкретной платформы (например, Xamarin или Desktop), скорее всего, будут работать и в Blazor. Вот несколько отличных примеров библиотек:
- Markdig для преобразования строк markdown-разметки в HTML,
- FluentValidation для создания правил проверки на уровне приложения.

Продолжение следует…

Источник:
https://www.telerik.com/blogs/10-blazor-features-you-probably-didnt-know
День семьсот сорок шестой. #ЗаметкиНаПолях #Blazor
10 Функций
Blazor, о Которых Вы Вероятно не Знали. Продолжение
Начало 1-2
Продолжение 3-4
Продолжение 5-6

7. Библиотеки классов Razor: маршрутизация и сервисы
В Blazor не только легко использовать общий код с библиотеками классов .NET, но также легко использовать общие компоненты Razor и веб-ресурсы с помощью библиотек классов Razor. Библиотеки классов Razor (RCL) могут включать CSS, JavaScript, статические файлы, такие как изображения, а также компоненты. Компоненты в RCL могут содержать директивы маршрута, и эти маршруты легко добавляются в любое приложение Blazor, которое хочет их использовать.

Настройка общей маршрутизации
В корневом компоненте приложения Blazor, App.razor, маршрутизация настраивается при помощи компонента Router. Компонент Router имеет необязательный параметр AdditionalAssemblies, который используется для поиска маршрутов из других сборок. Просто укажите сборку, и Blazor найдёт любые маршруты и добавит их в приложение. Повторяющиеся маршруты вызовут ошибку компилятора, поэтому используйте их с осторожностью.
<Router
AppAssembly="@typeof(Program).Assembly"
AdditionalAssemblies="new[]
{ typeof(MyComponent).Assembly }">
...
</Router>

Сервисные интерфейсы для библиотек классов Razor
Компоненты в RCL также могут использовать интерфейсы для совместного использования сервисов. В зависимости от типа проекта Blazor, приложения могут запускаться на стороне клиента в WebAssembly или на сервере. Основное различие между компонентами, работающими в WebAssembly, и на стороне сервера заключается в том, как они получают данные. WebAssembly-приложению потребуется HTTP-запрос для получения данных, а серверное приложение может взаимодействовать со службами напрямую без HTTP.
На рисунке ниже мы видим схему того, как два приложения могут использовать общий компонент при делегировании сервиса данных через интерфейс.

8. Полноценное тестирование и контроль качества
Blazor - это новый фреймворк для веб-приложений, который обещает предоставить нативные возможности веб-клиента без необходимости написания кода JavaScript. Разработчики могут легко создавать полнофункциональные веб-приложения с помощью платформы и инструментов .NET. Многие выделяют этот упор на .NET как сильную сторону Blazor, однако наибольший потенциал у Blazor может быть в тестировании.
Два распространенных подхода к тестированию компонентов Blazor — это сквозное (end-to-end, E2E) и модульное тестирование:
1. Модульные тесты пишутся с помощью библиотеки модульного тестирования, и покрывают:
- рендеринг компонентов,
- проверку вывода и состояния компонентов,
- запуск обработчиков событий и методов жизненного цикла,
- утверждения, что поведение компонента правильное.
bUnit - пример библиотеки, которая позволяет выполнять модульное тестирование компонентов Razor.

2. При E2E тестировании средство выполнения тестов запускает приложение Blazor и проверяет тестируемую систему, взаимодействуя с ней через браузер. Selenium - пример среды тестирования E2E, которую можно использовать с приложениями Blazor.

Окончание следует…

Источники:
-
https://www.telerik.com/blogs/10-blazor-features-you-probably-didnt-know
-
https://docs.microsoft.com/ru-ru/aspnet/core/blazor/test
День семьсот сорок седьмой. #ЗаметкиНаПолях #Blazor
10 Функций
Blazor, о Которых Вы Вероятно не Знали. Окончание
Начало 1-2
Продолжение 3-4
Продолжение 5-6
Продолжение 7-8

9. Ленивая загрузка кода .NET
В .NET 5.0 для Blazor была добавлена новая инфраструктура для загрузки библиотек по запросу. Загрузка сборок по запросу сокращает время начальной загрузки приложения за счёт откладывания запроса ресурса до тех пор, пока он не понадобится. Хотя поддержка включена в платформу Blazor, она не включена по умолчанию, и Blazor необходимо указать, когда загружать ресурс. Одним из преимуществ ручной настройки является то, что спецификации для загрузки сборки настраиваются в соответствии с потребностями приложения.

Настройка ленивой загрузки
Чтобы включить ленивую загрузку в приложении, необходимо:
1. Описать сборки, которые будут лениво загружаться, в файле конфигурации приложения csproj:
<ItemGroup>
<BlazorWebAssemblyLazyLoad Include="LoadMe.dll" />
</ItemGroup>
2. Зарегистрировать сервис LazyAssemblyLoader посредством внедрения зависимостей в корневой компонент приложения, App.razor:
services.AddScoped<LazyAssemblyLoader>();
3. В App.razor навигация перехватывается с помощью события OnNavigateAsync, которое может использоваться для ленивой загрузки сборок на основе информации о маршруте. При возникновении события сборки извлекаются и загружаются с помощью метода LoadAssembliesAsync сервиса LazyAssemblyLoader:
@inject LazyAssemblyLoader loader
<Router AppAssembly="@typeof(Program).Assembly"
OnNavigateAsync="@OnNavigateAsync">

@code {
private async Task
OnNavigateAsync(NavigationContext args) {
try {
if (args.Path.EndsWith("/lazy")) {
var assemblies =
await loader.LoadAssembliesAsync(
new List<string>(){"LoadMe.dll"});
lazyLoadedAssemblies.AddRange(assemblies);
}
}
catch (Exception ex){…}
}
}

10. Ленивая загрузка JavaScript
В .NET 5.0 появилась возможность отложенной загрузки модулей через JavaScript interop.
@code {
IJSObjectReference module;
string result;
//Загружаем модуль
protected override async
Task OnAfterRenderAsync(bool firstRender) {
if (firstRender) {
module = await JS
.InvokeAsync<IJSObjectReference>(
"import", "./exampleJsInterop.js");
}
}
//вызываем метод модуля
Task Prompt(string message) {
result = await module
.InvokeAsync<string>(
"showPrompt", message);
}
private async ValueTask
IAsyncDisposable.DisposeAsync() {
await module.DisposeAsync();
}
}
При использовании модулей JavaScript важно удалять их, если они больше не нужны. Для этого выше используется метод DisposeAsync.

Источник: https://www.telerik.com/blogs/10-blazor-features-you-probably-didnt-know
День 1274. #ЧтоНовенького
Обновления
ASP.NET Core в .NET 7 Превью 6. Окончание
Начало

6. Поддержка регистрации дополнительных заголовков запросов в W3CLogger
W3Clogger – логгер, который пишет лог-файлы в формате стандарта W3C.
Теперь вы можете указать дополнительные заголовки запросов AdditionalRequestHeaders() в W3CLoggerOptions:
services.AddW3CLogging(l =>
{
l.AdditionalRequestHeaders.Add("x-forwarded-for");
l.AdditionalRequestHeaders.Add("x-client-ssl-protocol");
});

7. Пустые шаблоны проектов Blazor
В Blazor появились два новых шаблона проектов для старта «с чистого листа». Новые шаблоны такие же, как их непустые аналоги, но без дополнительного демонстрационного кода, только с очень простой домашней страницей. Также удалён Bootstrap, чтобы можно было использовать любой CSS-фреймворк.

Новые шаблоны доступны в Visual Studio после установки пакета SDK для .NET 7, а также из командной строки:
dotnet new blazorserver-empty
dotnet new blazorwasm-empty

8. Поддержка System.Security.Cryptography в WebAssembly
.NET 6 поддерживал семейство алгоритмов хеширования SHA при работе на WebAssembly. .NET 7 позволяет использовать больше криптографических алгоритмов, используя преимущества SubtleCrypto, когда это возможно, и возвращаясь к реализации .NET, когда SubtleCrypto использовать нельзя. Теперь поддерживаются следующие алгоритмы:
- SHA1
- SHA256
- SHA384
- SHA512
- HMACSHA1
- HMACSHA256
- HMACSHA384
- HMACSHA512
Поддержка AES-CBC, PBKDF2 и HKDF запланирована в будущих обновлениях .NET 7.

9. Поддержка пользовательских элементов Blazor больше не является экспериментальной
Ранее экспериментальный пакет Microsoft.AspNetCore.Components.CustomElements для создания пользовательских элементов Blazor на основе стандартных больше не является экспериментальным и теперь является частью выпуска .NET 7. Подробности см. в документации о создании пользовательских элементов Blazor.

10. Экспериментальный компонент QuickGrid для Blazor
QuickGrid — это новый экспериментальный компонент Blazor для быстрого и эффективного отображения данных в табличной форме. QuickGrid предоставляет простой и удобный компонент сетки данных для наиболее распространённых случаев. Чтобы использовать компонент, добавьте пакет
Microsoft.AspNetCore.Components.QuickGrid. Примеры использования можно посмотреть здесь.

Источник: https://devblogs.microsoft.com/dotnet/asp-net-core-updates-in-dotnet-7-preview-6/
👍10
День 1437. #ЗаметкиНаПолях #Blazor
Вызываем Код JavaScript из
Blazor WebAssembly
Одна из серьезных проблем модернизации существующего или «устаревшего» кода заключается в том, насколько сложно начать работу, потому что код слишком сложен или объёмен. Рефакторинг и переписывание может стать проще, если вы можете интегрировать новый код с существующим устаревшим кодом, а затем медленно и итеративно мигрировать с течением времени.

Сегодня рассмотрим, как из кода Blazor WASM вызвать JavaScript-функцию, которая будет примером некоторого существующего устаревшего кода.

Допустим, у нас есть какая-то функция на Javascript:
var arg = 0;
function legacyFunction(arg) {
var nxt = arg + 1;
console.log(arg + ' > ' + nxt);
return nxt;
}

Чтобы вызвать её в проекте Blazor WASM, нам потребуются 3 простых шага:
1) Добавить тег script со ссылкой на файл Javascript кода в файл шаблона страниц (например, index.html):
<script src="legacysample.js"></script>

2) На странице Razor-компонента внедрить JSRuntime:
@inject IJSRuntime JSRuntime

3) На странице Razor-компонента написать Blazor-функцию с вызовом Javascript кода с помощью JSRuntime:
var currentCount = 0;
...
async void IncrementCount()
{
currentCount = await
JSRuntime.InvokeAsync<int>(
"legacyFunction", currentCount);
}

На этом третьем и последнем шаге вы можете видеть, что currentCount использует вызов JSRuntime.InvokeAsync с целочисленным типом результата, возвращаемого JavaScript-функцией «legacyFunction», и currentCount, передаваемого в качестве аргумента. Обратите внимание, что метод был изменён на асинхронный для использования await, чтобы JSRuntime мог завершить InvokeAsync, прежде чем вернуть управление Razor-компоненту.

Источник: https://dev.to/aztecconsulting/invoking-legacy-javascript-from-blazor-webassembly-using-the-jsruntime-1df3
👍6
День 2271. #TipsAndTricks #Blazor
Пользовательская Страница 404 в
Blazor
Иногда нужно иметь пользовательскую (дружелюбную к посетителю) страницу 404. Начиная с .NET 8 в Blazor Web App тег <NotFound> маршрутизатора (Router) больше не работает, поэтому создадим собственную страницу.

До Blazor Web App
Раньше можно было использовать следующий код внутри компонента маршрутизатора:
<Router AppAssembly="@typeof(Program).Assembly">
<Found Context="routeData">
<AuthorizeRouteView RouteData="@routeData"
DefaultLayout="@typeof(MainLayout)"/>
</Found>
<NotFound>
<LayoutView Layout="@typeof(MainLayout)">
<p>Здесь идёт код, отображающийся когда страница не найдена.</p>
</LayoutView>
</NotFound>
</Router>

Это всё ещё будет работать со «старым» подходом, где вы выбираете либо Blazor WebAssembly, либо Blazor Server (с использованием файла <script src="_framework/blazor.server.js"></script>). Но в новых шаблонах веб-приложения Blazor это больше не работает. Вы всё ещё можете добавить дочерний элемент NotFound в разметку маршрутизатора, но он не будет использоваться. Всё потому, что сам маршрутизатор теперь другой. Новый шаблон проекта использует файл <script src="_framework/blazor.web.js"></script> в App.razor и имеет AddInteractiveServerComponents в контейнере сервисов.

Добавление страницы «не найдено»
Мы можем определить веб-страницу, которая будет отображаться с более низкой специфичностью, т.е. иметь наименьший приоритет. Назовём её NotFoundPage.razor:
@page "/{*route:nonfile}"

<p>Здесь идёт код, отображающийся когда страница не найдена.</p>

@code {
[Parameter]
public string? Route { get; set; }
}

Параметр Route не используется, но он обязателен. В противном случае Blazor выбросит исключение, что он не может связать маршрут со свойством.

Источник: https://steven-giesel.com/blogPost/38a4f1dc-420f-4489-9179-77371a79b9a9/a-custom-404-page-in-blazor-web-apps
👍3
День 2343. #ЧтоНовенького
Вышел 5 Превью .NET 10. Начало
Microsoft объявили о выпуске .NET 10 превью 5, представив обновления для нескольких компонентов, включая ASP.NET Core, .NET MAUI, WPF и EF Core.

ASP.NET Core
1. Появилась возможность настраивать пользовательские дескрипторы безопасности для очередей запросов HTTP.sys через свойство RequestQueueSecurityDescriptor в HttpSysOptions. Это обеспечивает лучший контроль над доступом к очередям запросов на уровне ОС.

2. API валидации, поддерживающие Minimal API, были помечены как экспериментальные, чтобы разрешить будущие модификации, хотя API AddValidation верхнего уровня остаются стабильными.

3. Генерация OpenAPI была улучшена в версии 3.1. Выпуск также расширяет извлечение метаданных из XML-документации, распознавая теги <returns> и <response> для описаний ответов.

4. В Blazor представлен метод для более простого рендеринга страниц Not Found путем указания компонента NotFoundPage в конфигурации маршрутизатора. Этот подход имеет приоритет над старым фрагментом NotFound. Теперь страница NotFound.razor включена в шаблоны проектов по умолчанию и будет отображаться всякий раз, когда в приложении вызывается метод NavigationManager.NotFound():
<Router AppAssembly="@typeof(Program).Assembly" NotFoundPage="typeof(Pages.NotFound)">
<Found Context="routeData">
<RouteView RouteData="@routeData" />
<FocusOnNavigate RouteData="@routeData" Selector="h1" />
</Found>
<NotFound>This content will be ignored because we have NotFoundPage defined.</NotFound>
</Router>


5. Введены подробные метрики и возможности трассировки для приложений Blazor. Метрики публикуются через выделенные счетчики для компонентов, событий жизненного цикла и конвейеров сервера. Трассировка использует новый источник активности Microsoft.AspNetCore.Components, включающий подробный инструментарий для навигации, обработки событий и жизненных циклов конвейера. Разработчики могут включить эту диагностику, настроив OpenTelemetry для сбора данных из соответствующих источников и счётчиков:
builder.Services
.ConfigureOpenTelemetryMeterProvider(p =>
{
p.AddMeter("Microsoft.AspNetCore.Components");
p.AddMeter("Microsoft.AspNetCore.Components.Lifecycle");
p.AddMeter("Microsoft.AspNetCore.Components.Server.Circuits");
});

builder.Services
.ConfigureOpenTelemetryTracerProvider(p =>
{
p.AddSource("Microsoft.AspNetCore.Components");
});


Окончание следует…

Источник:
https://www.infoq.com/news/2025/06/dotnet-10-preview-5/
👍10
День 2375. #ЧтоНовенького #NET10
Новинки .NET 10 Превью 6. Начало

Microsoft анонсировали шестую превью версию .NET 10, включающую широкий спектр улучшений для среды выполнения .NET, SDK, библиотек, C#, ASP.NET Core, Blazor и .NET MAUI.

CLI
1. Инструменты .NET теперь можно публиковать с поддержкой нескольких идентификаторов среды выполнения (RID) в одном пакете. Разработчики инструментов могут объединять двоичные файлы для всех поддерживаемых платформ, а .NET CLI выберет нужный вариант при установке или запуске. Это значительно упрощает разработку и распространение кроссплатформенных инструментов.

2. Теперь вы можете использовать команду dotnet tool exec для одноразового запуска инструмента .NET без его глобальной или локальной установки. Это особенно полезно для непрерывной интеграции/разработки (CI/CD) или кратковременного использования. Инструмент будет скачан, если он не установлен локально.

3. Возможности интроспекции CLI были расширены с помощью опции --cli-schema, которая выводит машиночитаемое JSON-представление команд, облегчая автоматизацию и написание скриптов.

ASP.NET Core
Улучшено управление памятью пулов. Kestrel, IIS и HTTP.sys теперь поддерживают автоматическое освобождение неиспользуемой памяти из внутренних пулов при бездействии приложений. Как сообщается, это изменение не требует действий разработчика и призвано эффективно снизить потребление памяти. Метрики для пулов памяти теперь доступны в Microsoft.AspNetCore.MemoryPool, и разработчики могут создавать собственные пулы памяти с помощью нового интерфейса IMemoryPoolFactory.

Blazor
1. Новый компонент LinkPreload обеспечивает расширенный контроль над предварительной загрузкой ресурсов фреймворка, повышая производительность и определение базового URL-адреса.

2. Проекты Blazor WebAssembly теперь могут генерировать выходные данные, совместимые с упаковщиками JavaScript, такими как Webpack, установив WasmBundlerFriendlyBootConfig в значение true, что обеспечивает лучшую интеграцию с современными фронтенд-конвейерами.

3. Поддержка валидации в Blazor расширена и теперь включает вложенные объекты и коллекции в формах. Эта новая возможность реализуется через AddValidation() и атрибут [ValidatableType], при этом следует отметить, что атрибут остаётся экспериментальным.

4. Диагностика Blazor также была улучшена: трассировки теперь отображаются как действия верхнего уровня, что упрощает телеметрию в таких инструментах, как Application Insights.

5. Blazor Server теперь поддерживает сохранение состояния канала, позволяя пользователям возобновлять работу после повторного подключения, даже после отключения на стороне сервера. Разработчики могут управлять поведением канала с помощью новых API Blazor.pause() и Blazor.resume(), что поможет снизить потребление ресурсов сервера в периоды бездействия.

Окончание следует…

Источник:
https://www.infoq.com/news/2025/07/dotnet-10-preview-6/
👍8
День 2449. #TipsAndTricks #Blazor
Лучшие Практики по Созданию Веб-Приложений в
Blazor. Начало
Рассмотрим 9 рекомендаций по созданию веб-приложений Blazor.

1. Понимание жизненного цикла компонента
Первый и самый важный шаг при изучении Blazor — это правильное понимание жизненного цикла компонента. Blazor использует компонентно-ориентированную систему рендеринга, похожую на другие современные фреймворки веб-приложений, такие как Angular или React. См. подробнее о создании Blazor-компонентов.
Помимо изучения реализации компонентов Blazor, важно понимать, когда компонент Blazor автоматически перерисовывается и как управлять этим поведением. Например, мы можем переопределить метод жизненного цикла ShouldRender для управления обновлением UI. Если метод возвращает true, компонент перерисовывается.

2. Выбор правильного размера компонента
Одна из самых сложных задач - решение о том, когда следует разбить код на несколько компонентов. Нужно начать с простого. Сначала создаём маршрутизируемый компонент страницы и пишем весь код в нём. В какой-то момент код разрастается, и приходит понимание, что часть кода не связана с другой частью. Например, обработка формы никак не связана с отображением таблицы. Это сигнал, чтобы разделить компоненты, извлечь дочерние компоненты и превратить компонент страницы в оркестратор нескольких дочерних компонентов.
Не существует правильного или неправильного подхода, и требуется опыт, чтобы понять, что работает лучше всего. Одно из полезных правил - выделять то, что связано друг с другом, и ценить связность больше, чем размер (количество строк кода).

3. Реализация независимого режима рендеринга для Blazor-компонентов
С появлением интерактивного режима рендеринга в .NET 8 мы получаем гораздо больше гибкости по сравнению с предыдущими версиями Blazor. Например, мы можем реализовать веб-приложение, полностью отрисовываемое на сервере, без какой-либо интерактивности. Или можем комбинировать интерактивность Blazor Server и Blazor WebAssembly в одном приложении.
Для обеспечения гибкой архитектуры рекомендуется настроить компоненты Blazor так, чтобы они не зависели от режима рендеринга. Т.е. не задавать тип интерактивности внутри каждого компонента, а задавать его только на верхнем уровне. Это позволяет использовать компонент как часть интерактивного приложения Blazor Server и Blazor WebAssembly.

4. Изучите правильную обработку событий
Узнайте, как привязывать методы C# к событиям, вызываемым HTML-элементами. Это фундаментальный механизм для реализации обработчиков onClick для кнопок или обработчиков отправки для HTML-форм. При регистрации событий .NET, таких как событие LocationChanged класса NavigationManager, обязательно отписывайтесь от события при удалении компонента. В противном случае компонент не будет уничтожен сборщиком мусора.
@implements IDisposable
@inject NavigationManager NavigationManager

protected override void OnInitialized()
{
NavigationManager.LocationChanged
+= LocationChanged;
}

void LocationChanged(
object sender,
LocationChangedEventArgs e)
{
System.WriteLine("Location changed");
}

void IDisposable.Dispose()
{
NavigationManager.LocationChanged
-= LocationChanged;
}

Что касается связи между компонентами, обратные вызовы событий (EventCallback) являются стандартным способом осуществления обратного вызова родительского компонента из дочернего компонента.

Окончание следует…

Источник:
https://www.telerik.com/blogs/blazor-basics-9-best-practices-building-blazor-web-applications
👍7
День 2450. #TipsAndTricks #Blazor
Лучшие Практики по Созданию Веб-Приложений в
Blazor. Окончание
Начало

5. Выберите подходящий метод управления состоянием
Blazor предлагает различные варианты управления состоянием. Параметры компонентов — самый простой вариант, за которым следуют каскадные значения и извлечение состояния в специализированные реализации сервисов.
Для больших приложений может подойти библиотека управления состоянием, например, Fluxor, или другой контейнер глобального состояния. Однако имейте в виду, что обработка глобального состояния может привести к сложностям в приложении.

6. Правильная организация и структура кода
Используйте чёткую, понятную и организованную структуру кода. Например, группируйте связанные компоненты по папкам, а сервисы и страницы — в логические папки.
Также следуйте рекомендациям по именованию компонентов, таким как соглашения об именовании, и разделяйте задачи путём извлечения компонентов, чтобы повысить удобство поддержки всего приложения.
Новый шаблон веб-приложения Blazor в .NET 8 - хорошая отправная точка. Однако обязательно реорганизуйте код, когда приложение значительно разрастётся в той или иной области, чтобы не приходилось постоянно искать связанные части кода.

7. Защитите приложение
Ознакомьтесь с лучшими практиками веб-безопасности, такими как OSWASP Top 10, и примите меры, особенно при работе с конфиденциальными данными.
Используйте аутентификацию и авторизацию ASP.NET Core для защиты доступа к конечным точкам и страницам Blazor. Храните только ту информацию, которая необходима для выполнения ваших бизнес-задач. Всегда используйте HTTPS.
Не храните пароли пользователей самостоятельно. Используйте провайдер аутентификации. Если нет другого варианта и приходится хранить учётные записи пользователей самостоятельно, убедитесь, что пароли правильно хэшируются с помощью надежного алгоритма хэширования, например, BCrypt.

8. Используйте правильную обработку ошибок и ведение журнала
Реализуйте надёжное решение для обработки ошибок и исключений. Убедитесь, что логи содержат важную информацию для решения проблем в коде. В то же время избегайте регистрации конфиденциальной информации и заменяйте ее плейсхолдерами.
Вы можете использовать фреймворк логирования ASP.NET Core или добавить более гибкое и эффективное решение, например, Serilog.

9. Максимально простое решение
Один из самых недооценённых советов как в разработке ПО в целом, так и в разработке на Blazor — это простота. Существует множество сложных реализаций, которые можно заменить простыми решениями. Всегда стремитесь реализовать максимально простое решение любой задачи.
Например, когда нужно передать значение компоненту, начните с использования параметра компонента. Зачем реализовывать сложный сервис и внедрять его в дочерний компонент, если можно решить проблему с помощью простого параметра компонента?

Источник: https://www.telerik.com/blogs/blazor-basics-9-best-practices-building-blazor-web-applications
2👍5