C# Portal | Программирование
13.9K subscribers
1.15K photos
126 videos
29 files
926 links
Присоединяйтесь к нашему каналу и погрузитесь в мир для C#-разработчика

Сотрудничество, реклама: @devmangx

Менеджер: @Spiral_Yuri

РКН: https://clck.ru/3FocB6
Download Telegram
C#-приложения с файловой моделью и поддержкой нескольких файлов — кому-то нужно? Появится в .NET 10.0.300 и будущих превью .NET 11

@dotnet

https://github.com/DamianEdwards/runfile/compare/main...include-directive

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
😁3
.NET 11 Preview 3 приносит обновления для dotnet run и развитие поддержки объединённых типов

— Улучшения поддержки объединённых типов в средах разработки (полифилы всё ещё требуются)

—`dotnet run -e` (встроенные переменные окружения)

— Файловые приложения → поддержка нескольких файлов (#:include)

— Улучшения dotnet watch с интеграцией Aspire

и другое...

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
🍾1
.NET 11 Preview 3 приносит важное обновление в EF Core:

Теперь можно выполнять запросы к JSON в SQL Server напрямую из LINQ

Раньше: ручной SQL + JSON_VALUE
Теперь: JsonContains

Меньше кода, чище и проще сопровождать.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍103😁3🍾3🤔1
.NET 10 включает dnx — по сути аналог npx для .NET.

dnx NuGet.Mcp.Server --yes


Скачивает и запускает локальный MCP-сервер. Установка не требуется.

Работает с MCP-серверами для NuGet, Azure, Bicep, Power Platform. Добавляешь в mcp.json — и готово.

Тихое, но важное изменение для AI-инструментария.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3🍾2
CQRS ≠ MediatR.

Перестаньте смешивать CQRS и MediatR.

То, что вы используете MediatR, не означает, что у вас реализован CQRS.

CQRS — это про разделение операций чтения и записи, часто с разными моделями, стратегиями хранения и иногда с разными хранилищами данных.

MediatR — это библиотека для диспетчеризации сообщений внутри процесса. Она удобна для организации команд и запросов, но это не фреймворк CQRS.

Можно использовать MediatR в архитектуре, построенной по CQRS.

Но не стоит считать, что одно автоматически означает другое.

Сначала разберитесь в различии, прежде чем внедрять паттерн или инструмент.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍54🍾1
Два списания одновременно с одного и того же банковского счёта — что может пойти не так?

Если плохо управлять конкурентным доступом, последствия могут быть критичными:
-» дублирующиеся списания
-» потеря денег 💸

Начиная с .NET 9, используйте Lock и контролируйте конкурентный доступ.
#dotnet #csharp

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
10🥴4👎2🍾1
В EF Core методы Add() и AddAsync() не выполняют вставку в БД.

Они лишь помечают сущность как новую для последующей вставки.

Сам INSERT происходит при вызове SaveChanges() или SaveChangesAsync().

AddAsync() имеет смысл только в специфичных кейсах, например с HiLo, когда EF Core может получить идентификатор до сохранения.

#dotnet #efcore

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🍾2
Вот насколько просто создать HTTP-сервер с помощью минимального API в .NET на C#.

Ты уже знал об этом?

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🍾2
Устранение аллокаций byte[] в .NET Framework с использованием ReadOnlySpan<T>

В посте показывают, как убрать статические аллокации byte[] даже в .NET Framework с помощью Span<T>, разбирают соответствующий IL и обсуждают потенциальные риски

#dotnet

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍61🍾1
This media is not supported in your browser
VIEW IN TELEGRAM
90% разработчиков используют LINQ неправильно… и теряют производительность

Если вы повторяете вычисления внутри запроса, вы делаете двойную работу

Используйте let и оптимизируйте всё
одно вычисление
+ производительность
+ читаемость

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🤯32🍾1
Кэширование — одна из тех вещей, где каждый .NET-разработчик уверен, что разобрался.

Пока не ломается прод.

Большинство команд, с которыми я работал, используют IMemoryCache или Redis и на этом останавливаются. У обоих есть реальные проблемы, которые проявляются только на масштабе.

Потом в .NET 9 появился HybridCache и тихо закрыл то, что обычно костылят вручную.

Разберём по порядку.

𝗜𝗠𝗲𝗺𝗼𝗿𝘆𝗖𝗮𝗰𝗵𝗲

Очень быстрый. Живёт внутри приложения, чтение практически бесплатное.

Но как только появляется больше одного инстанса — начинаются рассинхроны. Каждый сервер держит свою копию. Пользователь попадает на сервер A — получает свежие данные. Следующий запрос уходит на сервер B — получает устаревшие. Баги, которые всплывают только в проде.

𝗥𝗲𝗱𝗶𝘀 (или любой распределённый кэш)

Общий для всех инстансов. Проблему консистентности закрывает.

Но каждое чтение — это сетевой вызов плюс сериализация с обеих сторон. Быстрее базы, но уже не уровень in-memory.

𝗛𝘆𝗯𝗿𝗶𝗱𝗖𝗮𝗰𝗵𝗲

Идея простая: использовать оба слоя.

Сначала проверяется память (L1). Если есть — возврат мгновенно.
Если нет — проверяется Redis (L2). Если есть — вернуть и прогреть L1.
Если нет — запрос в базу, запись в оба слоя, возврат.

Скорость памяти для горячих данных. Консистентность распределённого кэша для остального.

𝗣𝗿𝗼𝗯𝗹𝗲𝗺𝗮, о которой редко говорят

Часто ловит даже опытные команды.

Представим: популярный ключ протух. В этот же момент приходит 500 запросов на этот ключ. Все 500 промахиваются по кэшу. Все 500 одновременно идут в базу.

База ложится. Локально почти не воспроизводится.

Обычно это закрывают через SemaphoreSlim и ретраи. HybridCache решает это из коробки: только один запрос идёт за данными, остальные ждут тот же результат.

𝗣𝗼𝗷𝗲𝗺𝘂 это становится дефолтом

• Работает без Redis: старт с in-memory, потом подключение распределённого слоя без переписывания
• Инвалидация по тегам встроена — не нужно вручную трекать ключи
• Защита от конкурентных промахов уже есть
• Единый API — GetOrCreateAsync закрывает весь флоу
• Поставляется вместе с .NET 9

Если до сих пор пишется cache-aside логика с ручными локами и ретраями — HybridCache уже покрывает этот сценарий.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🍾2
В EF Core теперь можно использовать GroupBy() с комплексными типами

- Группировка выполняется по всему объекту
- EF корректно транслирует это в SQL GROUP BY
- Код чище и ближе к доменной модели
- Меньше колонок — больше бизнес-смысла

#dotnet #efcore #csharp

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
🍾51
Три способа описания навыков агента в .NET — файл, класс или встроенный вариант — все работают через одного провайдера. Добавляется выполнение скриптов и ручное подтверждение, что даёт гибкую и управляемую модель навыков для реальных приложений.

Статья: https://buff.ly/4jUlnBi

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
🍾2
dotNET 11 Preview 3 уже доступен — улучшения в JIT, доработки асинхронности, обновления WebCIL, поддержка Zstandard повсеместно, апдейты карт в MAUI, упрощение SQL в EFCore и подписанные контейнерные образы.

Если важны скорость, чистота и современный стек — есть на что посмотреть.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
🍾3
GitHub Quick Review (ghqr)

Бесплатный CLI с открытым исходным кодом, который сканирует организации и репозитории GitHub на соответствие лучшим практикам.

Одна команда — полный отчёт по состоянию.

https://github.com/microsoft/ghqr

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
🍾1
Не знаю, сколько из вас знают про этот репозиторий на GitHub по веб-сокетам.

В нём собрана вся документация, связанная с реализацией и использованием веб-сокетов, а также статьи и научные работы — в целом всё, что относится к ws, в одном месте.

(Это курируемый список инструментов, библиотек и материалов по веб-сокетам, сгруппированный по языкам и темам)

https://github.com/facundofarias/awesome-websockets

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
🍾1
Минимальные API и версионирование API — это бардак.

Если только не сделать это правильно.

Вместо того чтобы вешать ApiVersionSet на каждый эндпоинт, можно определить группу маршрутов.

Версия задаётся один раз и применяется ко всем эндпоинтам внутри группы.

Маршруты становятся чище, дублирования меньше. Плюс удобно для префиксов вроде /v1.

Хочешь посмотреть, как это работает (и с Minimal API, и с контроллерами)?

Вот гайд: https://milanjovanovic.tech/blog/api-versioning-in-aspnetcore

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
2🍾1
Ответы об ошибках в API обычно выглядят как мусор. ProblemDetails это исправляет.

Вот типичный ответ при ошибке:

"Object reference not set to an instance of an object."

Пользы ноль.

А вот что даёт ProblemDetails:

{
"title": "Product not found",
"status": 404,
"detail": "No product with ID 42.",
"instance": "/products/42"
}


Структурировано. Читаемо. Соответствует стандарту (RFC 9457).

В .NET 10 настройка стала удобнее.

Нужно три вещи:

→ AddProblemDetails() — регистрирует встроенные сервисы ProblemDetails
→ IExceptionHandler — современный способ обработки исключений (вместо кастомного посредника)
→ StatusCodeSelector — автоматически мапит типы исключений на HTTP-статусы

Изменение в .NET 10:

Если IExceptionHandler возвращает true, посредник больше не пишет диагностику (логи, метрики) по умолчанию.

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

Если нужно старое поведение — используй SuppressDiagnosticsCallback.

Базовая настройка в Program.cs занимает несколько строк:

- AddProblemDetails()
- AddExceptionHandler<YourHandler>()
- UseExceptionHandler()
- UseStatusCodePages()

Без сторонних пакетов. Без самописных посредников. Всё встроено в .NET.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6🤣2🍾1
Разработчик сделал то, что у Google не получалось годами.

Он создал браузер на Rust, который запускается мгновенно, потребляет в 10 раз меньше оперативной памяти и автоматически блокирует тысячи трекеров.

Проект уже набрал более 5k звёзд на GitHub, он бесплатный и с открытым исходным кодом.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
🌚5🤩2🤣2🍾1
Как правильно структурировать фичу в формате вертикального среза?

Вот простая структура вертикального среза, которую можно смело брать на вооружение:

🔸Объект запроса/ответа
🔸Определение эндпоинта
🔸Бизнес-логика

Всё, что относится к одной фиче, находится в одном месте.

Почему это круто — объяснено здесь

Если ты до сих пор не используешь подход с вертикальными срезами, скорее всего, твое приложение концептуально сложнее, чем нужно.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍53🍾2