C# (C Sharp) programming
18.6K subscribers
810 photos
41 videos
8 files
703 links
По всем вопросам- @haarrp

C# - обучающий канал Senior C# разработчика.

@ai_machinelearning_big_data - Machine learning

@itchannels_telegram - 🔥лучшие ит-каналы

@csharp_ci - C# академия

@pythonlbooks- книги📚

Реестр РКН: https://clck.ru/3Fk3kb
Download Telegram
🛠️ Инструмент для дампа памяти защищённых процессов

WSASS использует старую программу WerfaultSecure.exe для создания дампов памяти процессов, защищённых PPL, таких как LSASS.EXE. Выходные данные сохраняются в формате MINIDUMP, с автоматической заменой заголовка на PNG для удобства.

🚀 Основные моменты:
- Дамп защищённых процессов с помощью WerfaultSecure.exe
- Выход в формате Windows MINIDUMP
- Автоматическая замена заголовка файла
- Полезен для анализа безопасности

📌 GitHub: https://github.com/TwoSevenOneT/WSASS

#csharp
В какой строке возникнет ПЕРВАЯ ошибка
Anonymous Quiz
40%
1
30%
2
11%
3
2%
4
18%
ошибки не возникнет
🪄 magictools — curated-подборка инструментов и ресурсов для разработки игр

Если ты занимаешься геймдевом — этот репозиторий настоящий клад для поиска подходящих инструментов! Вот что внутри:

- Графика: от placeholders до редакторов и генераторов персонажей
- Spritesheets и анимация: инструменты для упаковки и обработки
- Фреймворки и движки: 2D/3D, физика, GUI, звук, освещение, генерация ландшафта и кастомные пайплайны
- Аудио и музыка: коллекции звуков и редакторы
- Книги, видео, подкасты, журналы и блоги: образовательное и вдохновляющее содержание
- Game Jam сообщества, исходники игр, управление проектами — всё в одном месте!
- Плюс разделы по AI, обучению, инструментам общего развития и прочему ценному

Этот список постоянно растёт и обновляется — отличное решение, чтобы не запутаться в инструментариуме.

https://github.com/ellisonleao/magictools

#GameDev #Ресурсы #Инструменты
🧭 Зачем нужен service discovery?

Проблема микросервисов проста: как сервисам надёжно находить и вызывать друг друга? Жёстко прописанные IP и порты ломаются при любом масштабировании, перезапуске, автосборке или миграции.

Что делает service discovery
- Даёт логические имена вместо физических адресов (users-api, billing, auth).
- Динамически находит живые инстансы и балансирует запросы.
- Упрощает масштабирование, blue/green-деплой и отказоустойчивость.

Как это работает (базовый поток)
1) Сервис регистрируется в реестре (name → адреса, порты, метаданные, health).
2) Клиент запрашивает реестр и получает актуальный адрес.
3) Клиент шлёт запрос по полученному адресу (часто с ретраями и timeouts).

Паттерны
- Client-side discovery: клиент сам спрашивает реестр (Consul, Eureka).
- Server-side discovery: маршрутизация через прокси/ингресс (Envoy, API-шлюз).
- K8s-вариант: встроенный DNS/Services дают стабильные имена.

Что выбрать
- Consul/Eureka — когда вы не в Kubernetes или хотите гибкий реестр и health-чеки.
- K8s Services — когда всё крутится в Kubernetes.
- Envoy/Traefik/API-шлюз — если нужен серверный роутинг, канареечные релизы, mTLS.

Как внедрить в .NET (пример с Consul)
- Поднимите Consul-агент (dev/cluster), включите health-чеки (HTTP/TCP/TTL).
- Регистрируйте сервис на старте приложения: имя, адрес, порт, теги, check.
- Разрешайте адреса через:
- Consul API (client-side discovery в коде .NET),
- или DNS-запросы вида service-name.service.consul (удобно для простых клиентов),
- или через sidecar/Envoy, чтобы вынести логику сетевого стека из приложения.
- Добавьте политики устойчивости (Polly): retries, circuit breaker, timeouts.
- Пропишите deregistration при остановке, чтобы не висели «мертвые» инстансы.
- Логи/метрики: мониторьте failing-чеки, латентность и распределение трафика.

Пример в .NET:

builder.Services
.AddHttpClient<ReportingServiceClient>(client =>
{
client.BaseAddress = new Uri("https://reporting-service");
})
.AddServiceDiscovery()
.AddRoundRobinLoadBalancer();


Итог
Service discovery — это «телефонная книга» вашего продакшена. Без него микросервисы быстро превращаются в хрупкий клубок адресов и ручных костылей. В .NET связка Consul + health-чеки + политики устойчивости даёт простой и надёжный старт.

Для пошагового гайда по .NET и Consul ищите разбор Milan Jovanovic «Service discovery in microservices with .NET and Consul».
⚙️ Создание фоновых задач в .NET с Quartz

Если тебе нужно планировать фоновые задачи в .NET — попробуй Quartz.
Всё просто: реализуешь интерфейс, регистрируешь задачу — и Quartz берёт на себя расписание и выполнение.

Что делает Quartz удобным:
- Глубокая интеграция с Dependency Injection — можно внедрять сервисы, логеры и репозитории;
- Scoped-область задач — безопасно использовать DbContext без проблем с жизненным циклом;
- Умный планировщик: без ручных таймеров и бесконечных циклов.

После Quartz уже не хочется возвращаться к ручным решениям.

📘 Подробный гайд по продвинутой работе с Quartz в .NET
Что выведет на экран этот код?
Anonymous Quiz
27%
A42
16%
A6
10%
G
22%
71
22%
Код не скомпилируется
4%
🥒
А ты правильно называешь свои DTO? 🤔

DTO (Data Transfer Object) — это объект передачи данных.

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

Когда ты создаёшь Web API, твои эндпоинты принимают и отдают данные.
Обычно такие модели называют с суффиксом DTO (Data Transfer Object).

Но вот в чём проблема 👇

DTO часто смешивают входные и выходные данные в одном классе.
Со временем такие классы разрастаются и становятся неразберихой.

👉 Лучше использовать суффиксы Request и Response:
• CreateUserRequest — для входных данных
• UserResponse — для выходных

Почему это лучше:

Понятнее — сразу видно, для чего модель.
Масштабируемо — изменения в Response не ломают Request.
Удобнее сопровождать — не нужно гадать, что делает UserDto.

📌 Совет: какую бы схему ты ни выбрал — будь последовательным и используй её во всём проекте.

А ты используешь Request/Response или по-старинке DTO? 👇
🔥 dotenvx — улучшенная версия популярной библиотеки dotenv, созданная её автором!

💡 Dotenvx предназначен для управления переменными окружения в приложениях и предлагает расширенные возможности, такие как поддержка нескольких сред, шифрование .env файлов и кроссплатформенность.

🔍 Основные преимущества dotenvx:

🌟 Шифрование .env файлов: обеспечивает безопасность конфиденциальных данных, хранящихся в переменных окружения.

🌟 Кроссплатформенность: совместим с различными языками программирования и фреймворками, такими как Python, PHP, Ruby, Go, Rust, Java, .NET и другие.

🔐 Лицензия: BSD-3-Clause

🖥 Github

@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
⚙️ 3 способа определить Middleware в ASP.NET Core

Middleware - это компоненты, которые добавляют дополнительную логику до или после обработки HTTP-запроса.

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

🔧 В ASP.NET Core уже встроено множество middleware (Static Files, Routing, Authentication и др.),
но вы можете создавать и свои собственные.

Вот три основных способа это сделать:
- Request Delegates - определяете логику прямо в app.Use(...)
- Convention-based - создаёте класс с методом Invoke или InvokeAsync
- Factory-based - используете фабрику с внедрением зависимостей (DI)

🧠 Подробный разбор и примеры кода - в статье


#dotnet #aspnetcore #backend #middleware #csharp
Media is too big
VIEW IN TELEGRAM
🖥 Шардирование в базах данных: обзор концепции

Шардирование или шардинг - это принцип проектирования базы данных, при котором данные разбиваются на части и размещаются на разных шардах.

Интерактивный лонгрид по шардированию баз данных.

В нем разобрано все - от принципов работы шардов и причин, зачем это вообще нужно, до тонкостей проектирования и типовых ошибок.
Каждый раздел сопровождается интерактивными диаграммами, с которыми можно экспериментировать прямо в статье.

Отличный материал, чтобы прокачать понимание распределённых БД на выходных 💡

Статья: https://planetscale.com/blog/database-sharding

Видео: https://www.youtube.com/watch?v=R2ML2jLs3_U
Please open Telegram to view this post
VIEW IN TELEGRAM
Ubuntu Unity остался без разработчиков и новых релизов

Проект Ubuntu Unity не может сформировать новый релиз 25.10 из-за отсутствия разработчиков, способных исправить критические проблемы с работой пользовательского окружения Unity, возникающие при использовании пакетной базы Ubuntu 25.10. Пользователям Ubuntu Unity не рекомендуется обновлять свои системы до ветки 25.10 или пытаться установить пакеты с Unity поверх других редакций Ubuntu 25.10, так как это может нарушить работоспособность системы.

https://opennet.ru/64125/
Но я уже и сам догадался
🔐 Что такое RBAC (Role-Based Access Control)

RBAC - это модель контроля доступа на основе ролей. Она помогает управлять авторизацией в приложениях просто и масштабируемо.

Как работает RBAC:
- Ролям назначаются определённые разрешения (permissions);
- Пользователям присваиваются роли, и через них - разрешения;
- Разрешения определяют, что пользователь может или не может делать.

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

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

💡 Простая концепция, но невероятно мощная в управлении доступом.

Подробнее
⚡️ Хорошая архитектура ничего не стоит, если её легко сломать.

Есть три способа заставить команду придерживаться дизайна:
- компилятор и статический анализ
- архитектурные тесты
- код-ревью

Компилятор - лучший друг. Он мгновенно ловит ошибки и не даст собрать проект, если что-то нарушено.
Но как использовать это для защиты архитектуры?

В .NET можно скрывать типы через internal и разделять код на проекты, чтобы изолировать модули.
Проблема - при масштабировании проектов становится слишком много.

Статический анализ полезен, но писать свои Roslyn-правила - удовольствие на любителя.

Поэтому я делаю ставку на архитектурные тесты.
Они позволяют задать правила в виде автотестов и контролировать зависимости между модулями, особенно в модульном монолите: каждый модуль видит только публичный API других модулей.

Ну и код-ревью - финальный фильтр. Кто-то должен глазами подтвердить, что всё ок.

Что выбрать?
Я больше всего полагаюсь на компилятор и архитектурные тесты - это помогает ловить проблемы максимально рано.

Хотите больше? Посмотрите пример использования архитектурных тестов и подход shift left.
Please open Telegram to view this post
VIEW IN TELEGRAM
Как вы организуете свои Vertical Slices?

Есть два подхода, и оба встречаются в живых проектах:

1) Один файл → статический класс + вложенные типы
- Request / Response внутри
- Handler внутри
- Validator внутри
- Endpoint там же
- максимум локальности и контекста
- удобно читать как "одна фича – один файл"

2) Каждый тип в отдельном файле
- Request.cs
- Response.cs
- Handler.cs
- Validator.cs
- Endpoint.cs
- привычно для больших команд
- проще искать по имени файла
- лучше работает при очень длинных обработчиках

По сути:

- маленькие обработчики → один файл с вложенными типами
- большие и долгоживущие фичи → отдельные файлы + папка

Главный принцип Vertical Slice — держать фичу целостной.
Не заставлять прыгать по всему solution ради одной команды.

А вы как делаете: всё в одном файле или дробите?```
⚡️ Что выведет код?


using System;

namespace MyApplication {
class Program {
static void Main(string[] args) {
int a = 10, b = 20;
Console.WriteLine("{0}+{1}", a, b);
}
}
}


- Объясните, почему вывод именно такой.
- Измените одну строку так, чтобы программа печатала сумму чисел в виде 10+20=30.

1) Ответ

Программа выведет:

10+20

2) Почему так

- В Console.WriteLine("{0}+{1}", a, b); используется композитное форматирование (аналог string.Format).

- Подстановки {0} и {1} заменяются на значения соответствующих аргументов — a и b.

- Знак + находится внутри строкового литерала, значит это просто символ, а не операция сложения.

- Поэтому получается «подставь a, затем символ +, затем b» → 10+20.

Частая ошибка: думать, что + выполнит сложение. Нет — внутри кавычек это обычный текст.