C# Portal | Программирование
13.1K subscribers
1.35K photos
132 videos
31 files
1.03K links
Присоединяйтесь к нашему каналу и погрузитесь в мир для C#-разработчика

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

Работаем с @Spiral_Yuri

РКН: https://clck.ru/3FocB6
Download Telegram
Добавляем Fixed Window Rate Limiter в ASP.NET Core

Можно настроить:

PermitLimit — количество разрешённых запросов
Window — размер временного окна в секундах (TimeSpan)
Нужно ли ставить входящие запросы в очередь

Rate limiting работает только in-memory.

Если нужен distributed rate limiter, часто используют что-то вроде Redis.

А для долгоживущих и персистентных лимитов можно использовать даже Postgres с locking, чтобы гарантировать соблюдение ограничений.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4🔥1🍾1
Что такое Domain Event в DDD?

Aggregates выступают в роли границы согласованности (consistency boundary) в домене. И в какой-то момент неизбежно возникает необходимость организовать взаимодействие между двумя aggregates.

Сделать это можно с использованием eventual consistency и domain events. Один aggregate создаёт domain event, а другие aggregates могут подписаться на это событие и соответствующим образом его обработать.

Вот как это можно реализовать с помощью EF Core:

https://milanjovanovic.tech/blog/how-to-use-domain-events-to-build-loosely-coupled-systems

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🍾1
от как можно реализовать tenant-based query filter с помощью EF Core.

Понадобится сервис, который будет предоставлять TenantId для текущего tenant.

Получить это значение можно из request header или из JWT (cookie) claim.

Побочный эффект такого подхода: использовать DbContext получится только в рамках HTTP request.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3🍾1
Почти готово 😳

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
😁21💯7🐳2🍾2
Моя любимая фича в C# 12 — Collection Expressions.

Она упрощает создание распространённых типов коллекций. С помощью spread-оператора .. можно даже встроить существующие коллекции прямо в новую.

Collection Expressions дают единый способ создания новых коллекций. Небольшое изменение, но теперь именно этот вариант используется по умолчанию практически во всём C#-коде.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8🥴2🍾1
This media is not supported in your browser
VIEW IN TELEGRAM
Браузерная игрушка обучает C#

RPG, где прогресс зависит не от кликов, а от того, насколько хорошо ты пишешь код на C#

Что внутри:
🔄Вы становитесь героем фантастического мира рыцари, монстры, нелегкие испытания

🔄Но вместо обычных “нажми кнопку, чтобы победить” вам нужно писать код на C#, чтобы решать задачи и прокачивать персонажа

🔄Стратегия, логика и программирование объединены развиваете не только персонажа, но и себя как разработчика


Отличный способ учиться C# в формате приключения. Игра затягивает, а навыки прокачиваются сами собой

https://rpg.dijix.com.ua/

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥2🥴2🍾1
Вот как можно реализовать tenant-based query filter с помощью EF Core.

Понадобится сервис, который будет предоставлять TenantId для текущего tenant. Получить это значение можно из request header или JWT (cookie) claim.

Побочный эффект такого подхода: DbContext можно будет использовать только в рамках HTTP request.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔4❤2🍾1
Как лучше всего получать значения конфигурации в .NET?

Для этого можно использовать Options pattern, и вот почему о нём стоит знать.

Конфигурация приложения может храниться в environment variables, JSON-файлах, user secrets или других configuration providers. Отдельные значения можно получать через интерфейс IConfiguration, но такой подход подвержен ошибкам и довольно неудобен, поэтому использовать его не рекомендуется.

Вместо этого можно использовать Options pattern:

• Создать класс, представляющий настройки
• Привязать свойства класса к настройкам приложения (JSON)
• Использовать Options pattern в коде через IOptions

Также в класс настроек можно добавить Data Annotations для простой валидации.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3🤯2🍾1
Братья мои во Христе, которые работают с .NET 6+, ради всего святого — используйте эту фичу по полной. Она реально помогает сократить количество кода в классе.

Иногда попадаются такие классы, что хочется спросить: ну серьёзно, это же ничего не стоит использовать.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
🥴14❤7👍1🍾1
Забираем полезный репозиторий для C#/.NET-разработчиков — готовый шаблон Clean Architecture для ASP.NET Core.

Внутри можно подсмотреть правильную структуру проекта, разделение слоёв, DDD, Dependency Injection, тестирование и другие практики для разработки поддерживаемых .NET-приложений.

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

GitHub: ardalis/CleanArchitecture

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9🍾2
Почему Redis может оказаться не таким эффективным, как кажется — большой практический разбор кэширования в .NET.

Автор начинает с реального OutOfMemory в проде, а затем на нагрузочных тестах сравнивает Redis/Valkey, ASP.NET Output Cache и MemoryCache. Разбирает влияние кэша на аллокации и GC, cache stampede, инвалидацию, ETag, conditional GET и клиентское кэширование.

Полезный материал для C#/.NET-разработчиков, которые хотят не просто «прикрутить Redis», а понимать, где и какой уровень кэширования действительно стоит использовать.

https://habr.com/ru/articles/1068772/

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🍾1
.NET и Владимир: отличный повод совместить митап и выходные в городе с историей

Офлайн-мероприятий для .NET-разработчиков сейчас не так много, а тут получается приятное комбо: встреча с другими разработчиками вечером в пятницу и возможность остаться на выходные в городе с историей.

В программе доклады от разработчиков Altenar и Рови Тех (часть Т-Банка):
— Async/await — асинхронность, которую можно читать.
— Как не терять данные при асинхронной интеграции программных систем.
— EF Core + PostgreSQL: за рамками CRUD.


Кстати, ещё на митапе запланированы активности для программистов: адаптации известных игр ("Сапер", "Крестики-нолики", "Гонки"), где для победы понадобится понимание математики и вероятностей.

Участие бесплатное, а ещё можно сэкономить на проезде — организаторы разыграют несколько билетов на "Ласточку" среди участников.

Для участия в розыгрыше:
1. Зарегистрируйтесь на митап.
2. Напишите «Хочу на .NET-митап на Ласточке» на почту aleksei.korneev@altenar.com с почты, указанной при регистрации.

Итоги розыгрыша подведём 14 сентября.


Регистрируйтесь, планируйте поездку и до встречи во Владимире!
😁3🍾1
Как я подхожу к тестированию приложений

Многие проекты сталкиваются с проблемами из-за неправильного подхода к тестированию. Codebase растёт, внесение изменений становится всё более рискованным, а разработчики теряют уверенность в своих deployments.

Особенно это актуально для проектов на Clean Architecture, где важно убедиться, что use cases работают корректно.

Мой подход к Unit Testing:

• NSubstitute для mock зависимостей
• Тестирование всех happy paths
• Тестирование всех failure paths
• Проверка обработки exceptions

Unit Testing помогает убедиться, что логика работает правильно. Пошаговый разбор этого подхода к тестированию:
https://milanjovanovic.tech/blog/unit-testing-clean-architecture-use-cases

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4🍾2
.NET tip: перестаньте прятать DateTime.UtcNow внутри кода.

Вместо этого используйте TimeProvider. В рабочем коде приложение получает реальное время, а в тестах можно использовать fake clock и самостоятельно перемещать время вперёд.

Небольшая абстракция, которая делает тесты гораздо удобнее.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🤯1🍾1
.NET Tip.Select() vs .SelectMany()

Практический пример:

Клиент запросил список всех технологий, которыми владеют ваши сотрудники.

#Dotnet

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
🍾5❤2
Какой самый быстрый способ выполнить SQL bulk insert?

Я протестировал все популярные подходы... Победитель — SqlBulkCopy. Это самый быстрый способ вставить большой объём данных в SQL Server. В PostgreSQL есть команда COPY, которая работает похожим образом.

Вот ещё 5 решений, которые сравнивались: https://milanjovanovic.tech/blog/fast-sql-bulk-inserts-with-csharp-and-ef-core

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4🍾1
Лучший урок по C#, который вы получите сегодня:
(чтобы сократить количество багов на 50%)

Не возвращайте null-коллекции из своих методов. Возвращайте пустые коллекции.

ПЕРЕСТАНЬТЕ:
• Заставлять вызывающий код проверять результат на null
• Засорять код лишними условиями
• Рисковать получить runtime exceptions, которые сложно отследить

НАЧНИТЕ:
• Возвращать new List<T>()
• Возвращать Enumerable.Empty<T>()
• Возвращать [] — collection expression из C# 12

Так код становится безопаснее, чище и понятнее. А остальные пусть продолжают тонуть в null-проверках.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12👎4❤2🍾2❤‍🔥1
Создавайте автономных AI-агентов на C#!

Соберите свой первый multi-agent workflow на .NET с помощью Microsoft AutoGen: agent loops, использование tools и выполнение кода.

Гайд Autonomous AI Agents in C# with AutoGen

#AgenticAI #CSharp #DotNet #AutoGen #AI

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5🔥3🤔2🍾1
Слышали о temporal coupling?

Вот фрагмент кода с распространённым anti-pattern: temporal coupling между сохранением данных и публикацией событий.

Проблема:
❤3🍾2❤‍🔥1
И кто же? 🙂

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
❤13🤣7🕊3💯1🍾1
Если хотите стать лучше как software engineer — освойте background jobs.

Вот почему они помогают создавать более масштабируемые системы.
Допустим, нужно вынести часть работы приложения в background, чтобы она выполнялась независимо от основного application flow.

Несколько примеров:

- Напоминать пользователям о продлении подписки
- Отправлять email после завершения продажи
- Обрабатывать сообщения из очереди
- Удалять устаревшие элементы из cache

В .NET background task можно настроить буквально за несколько минут. Самый простой подход — использовать класс BackgroundService. Начиная с .NET 8, такие background services также можно запускать параллельно.

Если требуется более надёжное и функциональное решение, первый выбор — Quartz.

Подробнее читать здесь.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1🍾1