C# Portal | Программирование – Telegram
C# Portal | Программирование
14.9K subscribers
965 photos
118 videos
24 files
808 links
Присоединяйтесь к нашему каналу и погрузитесь в мир для C#-разработчика

Связь: @devmangx

РКН: https://clck.ru/3FocB6
Download Telegram
Docker publisher в .NET Aspire позволяет описать всю среду разработки на C# и задеплоить её в Docker Compose.

Посмотрите, как Aspire упрощает работу с Docker Compose для .NET: тык

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍52
Для дотнетчиков подъехала полезная штука

Каждый год выходит новая версия C#, и уже давно стало трудно уследить за всеми фичами. Одни реально экономят время, другие просто красивые игрушки. 💃

Чтобы не тонуть в апдейтах, появился чеклист Stay Sharp. В нём собрали 23 самых толковых фичи из C# 9–13. Для каждой есть короткое объяснение, кусок кода и пример вывода в консоли.

Чеклист можно забрать бесплатно (может потребоваться ВПН)

Отличный способ быстро апнуть скилл и не пропускать реально полезные возможности языка

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
12👍4😁1
Малоизвестная фича в C# — type alias

Она позволяет давать новое имя уже существующему типу.
Мы использовали её в крупном проекте по модернизации, где было море конфликтов типов, и это реально спасло.

Причём alias работает даже с кортежами.

Кто-нибудь ещё применял это в продакшене? 🤝

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
16👍6😁2👎1
Младший разработчик подключает EF Core прямо в контроллере.

Миддл делает схему Контроллер - Сервис - Репозиторий.

Сеньор использует Clean Architecture.

Архитектор снова возвращает EF Core в контроллер.

Почему так? ☕️

Потому что в реальных проектах выигрывают простые решения.

Слои стоит добавлять только тогда, когда они действительно нужны.

Небольшое приложение спокойно живет с EF Core прямо в контроллерах или минимальных API эндпоинтах.

Проект среднего размера может выиграть от слоя приложений, например сервисов или хендлеров.

Большая система уже требует вертикальных срезов, Clean Architecture или даже DDD.

Главный урок в том, что не нужно перегружать архитектуру заранее. Строй по шагам.

Если понадобится больше сложности, можно добавить.
Если нет, оставляй всё простым и двигайся дальше.

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

P.S. EF Core уже реализует паттерны Repository и Unit of Work, поэтому в большинстве случаев писать свои репозитории нет необходимости.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥185😐4🤔1
Вышел экспресс курс по Keycloak 🎉

Keycloak это бесплатный сервер аутентификации который сразу даёт безопасные логины, управление паролями и JWT. Теперь не нужно тратить время на авторизацию с нуля и можно сосредоточиться на разработке приложения.

Всего за 45 минут показывают как поднять Keycloak в Docker, подключить и защитить .NET API, настроить OAuth 2.0 Authorization Code Flow, управлять пользователями, генерировать JWT и закрыть эндпоинты для неавторизованных запросов.

Полный курс тут

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤‍🔥4
Мало кто из разработчиков знает про Dynamic Authorization в ASP.NET Core

В ASP.NET Core, помимо Role-Based и Claims-Based подходов, можно использовать Dynamic Authorization

Это когда доступ к ресурсу зависит не только от роли пользователя, но и от его атрибутов, самого ресурса и окружения.

Примеры: автор может редактировать только свои книги, а региональный менеджер управляет данными только в своём регионе.

Реализуется это через Attribute-Based Authorization с IAuthorizationRequirement и AuthorizationHandler.

Подход полезен там, где нужно гибкое и контекстное управление правами. 😊

Подробнее про best practices в ASP.NET Core читай тут

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥53
Есть тема, о которой многие разработчики слышали вскользь, но глубоко не погружались, это рефлексия. Рефлексия это способность языка программирования «смотреть на себя», получать информацию о собственных структурах во время выполнения.

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

Пример 1

Класс Beer имеет три свойства: Name, Brewery, Alcohol. Через рефлексию мы получаем их список и типы.

// Смотрим тип объекта
Type type = typeof(Beer);

Console.WriteLine($"Тип: {type}");

// Свойства и их типы
Console.WriteLine("Свойства и типы:");

foreach (var prop in type.GetProperties())
{
Console.WriteLine($"{prop.Name} ({prop.PropertyType})");
}

// Класс для хранения пива
class Beer
{
public string Name { get; set; } = string.Empty;
public string Brewery { get; set; } = string.Empty;
public double Alcohol { get; set; }
}


Вывод в консоль:

Тип: Beer
Свойства и типы:
Name (System.String)
Brewery (System.String)
Alcohol (System.Double)


Во втором примере в класс добавили новое свойство Brand. Код не изменился, но при запуске список свойств автоматически расширился, и на консоли появился ещё один элемент:

// Смотрим тип объекта
Type type = typeof(Beer);

Console.WriteLine($"Тип: {type}");

// Свойства и их типы
Console.WriteLine("Свойства и типы:");

foreach (var prop in type.GetProperties())
{
Console.WriteLine($"{prop.Name} ({prop.PropertyType})");
}

// Класс для хранения пива
class Beer
{
public string Name { get; set; } = string.Empty;
public string Brewery { get; set; } = string.Empty;
public double Alcohol { get; set; }

// Новое свойство
public string Brand { get; set; } = string.Empty;
}


Вывод в консоль:

Тип: Beer
Свойства и типы:
Name (System.String)
Brewery (System.String)
Alcohol (System.Double)
Brand (System.String)


👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍83🔥2
Большинство сеньоров советуют создавать репозитории для EF Core.

Но это не лучший способ писать код.

По мере роста .NET-проекта работа с данными становится все сложнее.

Многие команды начинают с паттерна Repository, оборачивая в него запросы EF Core.

Сначала всё ок. Но со временем ваши репозитории либо делают слишком мало, либо пытаются делать слишком много.

Код становится труднее понимать и менять по мере того, как меняются бизнес-требования.

Каждый раз, когда нужен новый фильтр или запрос, вы добавляете ещё один метод или даже новый репозиторий.

Помните, что DbContext в EF Core уже реализует паттерны Repository и Unit of Work.

Это прямо указано в официальной документации Microsoft по DbContext. Это же видно в summary DbContext в IDE.

Создавая репозиторий поверх EF Core, мы получаем абстракцию поверх абстракции. И часто приходим к переусложнённым решениям.

Как решить проблему? Ответ: паттерн Specification. 😞

Паттерн Specification позволяет описывать, какие данные нужны из базы, с помощью небольших переиспользуемых классов — «спецификаций».

Каждая спецификация это правило или фильтр, который можно применить к запросу. Так можно собирать сложные запросы из простых и понятных блоков.

Полный разбор тут :

→ почему репозитории становятся узким местом в реальных проектах
→ что такое паттерн Specification
→ как внедрять спецификации в EF Core
→ продвинутые приёмы спецификаций

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍95👎2
Паттерн CQRS часто кажется сложным, но на деле он строится вокруг простых принципов.

Разработчики рекомендуют организовывать код вокруг use case'ов, которые отражают конкретный функционал приложения, например получить данные пользователя, добавить товар в корзину или оформить возврат.

То есть можно думать о use case как о бизнес-возможности.

Я строю код вокруг одного конкретного use case.

Есть два типа use case'ов:

Commands → бизнес-логика, работа с базой, побочные эффекты

Queries → возвращают данные в нужном виде для UI


Для реализации часто используют библиотеку MediatR, хотя после перехода проекта на платную модель многие задумываются о собственных решениях или остаются на бесплатной версии.

Подробнее о подходе CQRS можно почитать в блоге Милана Йовановича 💯

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
6😁2
Вместо того чтобы:

→ городить здоровенный метод с 5+ параметрами
→ и постоянно добавлять туда новые параметры

Сделай так:

1. Создай новый класс.
2. Свойства класса — это те же самые параметры метода.
3. Замени параметры метода на новый класс.
4. Поправь вызовы метода.

Этот рефакторинг называется Introduce Parameter Object.

И он быстро улучшит поддерживаемость кода. 🤝

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17😁53🤯3
Есть десктопное приложение под Mac, Windows и Linux, которое обучает работе с Git через практику. Никаких лекций, только реальные задания в Git и GitHub. Репозитории создаются прямо в вашем аккаунте, результат сохраняется навсегда. Плюс доступна поддержка разных языков.

Ссылка: https://github.com/jlord/git-it-electron

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥3
Как писать условные и при этом читаемые запросы?

Всё что нужно, это выражение CASE.

Оно работает так же, как if else if else в C#. Как только условие срабатывает, чтение останавливается и возвращается результат, если ни одно условие не выполнилось, возвращается значение из ветки ELSE.

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

Кроме того, CASE полезен, если у вас несколько ORDER BY для многоуровневой сортировки.

Но есть важный момент, который я сам однажды понял на практике, использовать CASE лучше в SELECT, а не в WHERE.

Почему? потому что WHERE почти всегда работает быстрее для фильтрации строк.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍74🔥2
This media is not supported in your browser
VIEW IN TELEGRAM
Карто-ориентированное программирование 😂

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
13😁12🌚3🏆3🔥1
9 паттернов, которые делают приложения реально живучими

В мире распределённых систем падения неизбежны. Вопрос не если, а когда. Но есть проверенные подходы, которые позволяют системе вставать после каждого сбоя.

→ 1. Circuit Breaker

• Работает как электрический предохранитель
• При постоянных сбоях сервис временно отключается от потока запросов
• Даёт возможность восстановиться без перегрузки
• Состояния: Closed — запросы проходят, Open — запросы сразу отваливаются
• Защищает от каскадных фейлов и изолирует проблемные сервисы

→ 2. Retry

• При падении запроса система повторяет его несколько раз
• Помогает при временных проблемах: сетевые глюки, недоступность сервиса
• Повышает доступность и сглаживает сбои
• Важно: избегать retry storm, использовать exponential backoff

→ 3. Timeout

• Ограничивает максимальное время выполнения запроса
• Если ответ не пришёл вовремя, считаем его неудачным

→ 4. Bulkhead

• Делит приложение на изолированные "отсеки" или пулы
• Сбой в одном отсеке не валит всё приложение

→ 5. Rate Limiting

• Контролирует поток входящих запросов
• Защита от перегрузки и DDoS
• Поддерживает стабильность и справедливое использование

→ 6. Fallback

• Возвращает запасной ответ или действие при сбое основного
• Улучшает доступность и UX, лучше частичный сервис, чем ошибка

→ 7. Hedging (Redundancy)

• Отправляет дублирующие запросы в несколько сервисов
• Использует самый быстрый ответ
• Уменьшает влияние медленных откликов и падений

→ 8. Load Shedding

• Отбрасывает второстепенные запросы при перегрузке
• Сохраняет работу ключевых функций
• Держит систему живой в пиковые моменты

→ 9. Backpressure

• Обратная связь между продюсером и консъюмером
• Консъюмер сообщает о своей нагрузке, продюсер регулирует скорость

Стратегии:

• Reactive Pull — консъюмер тянет данные сам
• Rate Limiting — продюсер ограничивает скорость по фидбеку
• Buffering — данные временно хранятся в буфере

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
13👍5🔥2
.NET 9 обошёл всех конкурентов по скорости. Он быстрее Java, Go, Python, Node.js, PHP и ещё десятка популярных фреймворков.

Адаптивный GC, умный JIT, векторизация на AVX10 и Arm SVE, Native AOT для контейнеров и IoT, быстрый System.Text.Json, минимальные аллокации и апгрейд минимальных API. Всё это даёт стабильный отклик и высокую пропускную способность даже под нагрузкой.

По бенчмаркам:

Spring медленнее в 2.5 раза, Fiber — в 1.3, Fastify — в 4, FastAPI — в 10, Rails — в 20, Laravel — в 15. Даже Ktor, Deno, Vapor и Phoenix отстают.

В 2025 .NET 9 позиционируется как лучшая платформа для продакшн-проектов: от микросервисов в Kubernetes до IoT и edge-нагрузок 😎

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
256👍12🔥10
Фича дня в EF Core — алгоритм Hi/Lo.

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

Работает это так. Приложение не берёт каждый новый ID отдельно, а запрашивает у базы целую пачку. В самой базе хранится hi_value, который отражает максимальный выданный идентификатор. Когда приложению нужна новая порция, оно начинает с hi_value + 1.

Минус в том, что могут появиться пропуски в последовательности, если приложение упадёт до того, как израсходует все ID из своей пачки, но это не критично.

Включается всё через метод UseHiLo, который создаёт в базе sequence для выдачи батчей идентификаторов. После этого EF Core может сам задавать все первичные ключи на клиенте, что особенно удобно для parent/child-отношений.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍3
Цифры задержек, которые стоит знать каждому разработчику:

L1 cache reference ......................... 0.5 ns
Branch mispredict ............................ 5 ns
L2 cache reference ........................... 7 ns
Mutex lock/unlock ........................... 25 ns
Main memory reference ...................... 100 ns
Сжать 1K байт с помощью Zippy ............. 3,000 ns = 3 µs
Отправить 2K байт по сети 1 Gbps .......... 20,000 ns = 20 µs
SSD random read ........................ 150,000 ns = 150 µs
Прочитать 1 MB последовательно из памяти .. 250,000 ns = 250 µs
Round trip внутри датацентра ................ 500,000 ns = 0.5 ms
Прочитать 1 MB последовательно с SSD .... 1,000,000 ns = 1 ms
Disk seek ........................... 10,000,000 ns = 10 ms
Прочитать 1 MB последовательно с диска .. 20,000,000 ns = 20 ms
Отправить пакет CA → Netherlands → CA ... 150,000,000 ns = 150 ms


👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥122
Слышал о новом типе UUID?

Я часто использую UUID (Guid в C#) как уникальные идентификаторы в базе.

Они удобны тем, что «рандомные», но есть и минусы.

Во-первых, они занимают много памяти — Guid в C# весит 16 байт.
Кроме того, индексы с такими значениями могут фрагментироваться, так как они не сортируемые.

Теперь появился UUID V7. Он сортируемый, потому что в нем есть компонент времени.

Его можно создать в .NET 9 через Guid.CreateVersion7

Также он будет поддерживаться нативно в PostgreSQL 18.

Ты бы стал его использовать? 🌟

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
17
1 потрясающая функция в Visual Studio, о которой я недавно узнал:

Endpoints Explorer.

Это окно, в котором ты можешь увидеть все свои API-эндпоинты в одном месте:

Просматривать URL эндпоинта и параметры

Открывать эндпоинт в редакторе кода

Выполнять HTTP-запрос

Чтобы открыть окно Endpoints Explorer, нужно перейти в:

View -> Other Windows -> Endpoints Explorer

P.S. Ты уже использовал эту функцию в Visual Studio? 🌟

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
20👍8🙏2
Не пытайся быть умным.

Работа не про то, чтобы писать «умный» код.

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

И про то, чтобы следующий разработчик мог без проблем продолжить твою работу.

Каждый раз, когда пишешь что-то, спрашивай себя:

«Если тот, кто будет поддерживать этот код, окажется психопатом, который знает, где я живу, спокойно ли я оставлю этот код как есть?»


Если нет — упростите. Прямо как будто от этого зависит твоя жизнь.

Будь понимающим коллегой, а не эгоистичным кодером. 🛌

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
15👍8👏2💯2🔥1