csharp_ci | Unsorted

Telegram-канал csharp_ci - C# (C Sharp) programming

18377

По всем вопросам- @haarrp C# - обучающий канал Senior C# разработчика. @ai_machinelearning_big_data - Machine learning @itchannels_telegram - 🔥лучшие ит-каналы @csharp_ci - C# академия @pythonlbooks- книги📚 Реестр РКН: https://clck.ru/3Fk3kb

Subscribe to a channel

C# (C Sharp) programming

⚡️ Hunyuan 3D Engine

Новый высокоточный ИИ-движок сокращает производство коммерческих 3D-ассетов с недель до нескольких минут.

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

Качество отвечает профессиональному уровню. Новый 3D-DiT модельный стек обеспечивает трёхкратный прирост точности и выдаёт ультра-HD разрешение. Форматы OBJ и GLB легко подключаются к Unreal Engine, Unity и Blender.

Модель также доступна через Tencent Cloud International.

Платформа даёт новым авторам 20 бесплатных генераций в день. Корпоративные клиенты получают 200 бесплатных кредитов при регистрации.

Попробовать движок можно на 3d.hunyuanglobal.com
API: tencentcloud.com/products/ai3d

#AI #3D #Hunyuan3D #Tencent #AItools #3Dgeneration

Читать полностью…

C# (C Sharp) programming

✔️ Задача C# и ASP.NET Core

В проде под нагрузкой периодически "умирает" интеграция с внешним сервисом оплаты:
в логах всплывают TimeoutException и SocketException: "Only one usage of each socket address...".

Фрагмент кода из сервисного слоя:


public class PaymentClient
{
private readonly string _baseUrl;

public PaymentClient(string baseUrl)
{
_baseUrl = baseUrl;
}

public async Task<bool> ChargeAsync(ChargeRequest request)
{
using var http = new HttpClient();
http.BaseAddress = new Uri(_baseUrl);

var response = await http.PostAsJsonAsync("/charge", request);
return response.IsSuccessStatusCode;
}
}


Под нагрузкой:

- растёт количество TIME_WAIT соединений
- часть запросов получает timeout
- p95 и p99 по этому методу улетают в космос

Какой вариант исправления правильный?

1. Увеличить Timeout у HttpClient и ServicePointManager.DefaultConnectionLimit.
2. Сделать HttpClient статическим полем и переиспользовать его во всех запросах.
3. Зарегистрировать HttpClient через IHttpClientFactory и использовать пул подключений, конфигурируя таймауты и политику повторов.

Как думаешь, какой вариант правильный?

Читать полностью…

C# (C Sharp) programming

✔️ Задача C# и ASP.NET Core

В проде под нагрузкой API начинает подвисать, медиана ответа растёт с 40 мс до 400 мс, а иногда и выше.
Логи показывают, что в горячем месте встречается такой



public async Task<User> GetUserAsync(int id)
{
using var conn = new SqlConnection(_conn);
conn.Open(); // 👈 синхронный блокирующий вызов

var cmd = conn.CreateCommand();
cmd.CommandText = "SELECT * FROM Users WHERE Id = @id";
cmd.Parameters.AddWithValue("@id", id);

using var reader = cmd.ExecuteReader(); // 👈 тоже блокировка

if (await reader.ReadAsync())
return Map(reader);

return null;
}


Под нагрузкой резко растёт:

- очередь ThreadPool
- количество заблокированных потоков
- p99 latency

Какой вариант исправления правильный?

1. Заменить ExecuteReader на ExecuteReaderAsync, но оставить conn.Open() как есть.
2. Вынести всё выполнение в Task.Run и пусть код работает на отдельных потоках.
3. Переписать весь путь на асинхронный: использовать OpenAsync, ExecuteReaderAsync и полностью убрать sync-over-async.

Как думаешь, какой вариант правильный?

Читать полностью…

C# (C Sharp) programming

🖥 Знаешь три типа времени жизни сервисов в .NET? Разбираем их максимально понятно.

В ASP.NET Core есть три режима работы сервисов:

1) Transient
Создаются каждый раз, когда ты их запрашиваешь.
Подходят для лёгких, stateless-объектов.

2) Scoped
Создаются один раз на время одного HTTP-запроса.
Все компоненты внутри запроса получают один и тот же экземпляр.
Можно вручную создать собственный scope для фоновых задач или отдельной логики.

3) Singleton
Создаются один раз на всё время работы приложения.
Резолвятся из корневого ServiceProvider.
Подходят для тяжёлых объектов и глобального состояния.

Важный вопрос
Что делать, если внутри Singleton нужно получить Scoped-сервис?
Напрямую — нельзя, это ломает жизненный цикл и приводит к ошибкам.

Но есть корректный способ сделать это правильно.

⚡️ Подробный разбор здесь.

Читать полностью…

C# (C Sharp) programming

💡 EF Core: как правильно настроить контроль конкурентности через RowVersion

В EF Core есть два удобных способа указать, что сущность должна использовать RowVersion для защиты от гонок при обновлении данных.

🟩 Вариант 1 - через атрибут в модели
Просто добавляете свойство типа byte[] и помечаете его [Timestamp]. EF автоматически будет обновлять версию записи и проверять конфликт изменений.

🟦 Вариант 2 - через Fluent API
Если не хотите засорять модель атрибутами, то же самое можно описать в OnModelCreating с помощью .IsRowVersion().

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

Читать полностью…

C# (C Sharp) programming

😁 Программируй бота на dev-платформе SourceCraft от Яндекса c AI-ассистентом!

На SourceCraft легко создать бот: хранить код, настраивать задачи, писать автотесты, автоматизировать развертывание. А вместе со встроенным AI-ассистентом это можно сделать еще быстрее!

💡 И вот что ещё круто: всем пользователям дарим грант 6 000 ₽ на сервисы облака, чтобы бот жил на полноценной инфраструктуре.

Получить грант и запустить бота

Создавай бота для любых задач на платформе SourceCraft!

Читать полностью…

C# (C Sharp) programming

Реактивное программирование в C# Advanced: сложные операторы, обработка ошибок и холодные/горячие Observable

Асинхронность в C# может быть простой, если знать, как с ней работать правильно. На открытом вебинаре курса OTUS C# Developer. Advanced Елена Сычева покажет, как реактивное программирование помогает избавиться от Callback Hell и писать код, который сам реагирует на данные и события.

📌 26 ноября, 20:00
Реактивное программирование в C# Advanced
— продвинутые операторы Rx.NET: Switch, GroupBy, Buffer, Throttle
— устойчивые к сбоям системы: Catch, Retry, Finally
— холодные и горячие Observable: Publish, Replay, RefCount
— управление подписками и жизненным циклом реактивных компонентов

Вебинар будет полезен разработчикам на C#, работающим с асинхронным кодом, потоками данных и событиями. Участники узнают, как проектировать реактивные системы, способные восстанавливаться после ошибок, и писать декларативный, читаемый и эффективный код.

👉 Зарегистрируйтесь: https://otus.pw/16bE/?erid=2W5zFJg2ejJ

Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.

Читать полностью…

C# (C Sharp) programming

Представь, тебе завтра пишет Microsoft и говорит:

“Мы хотим использовать ваш продукт. Поддерживаете ли вы SSO?”

Можешь ответить “да”?
Большинство SaaS-команд - нет. У них есть просто логин, но не корпоративный вход.

В больших компаниях сотрудники не создают отдельные пароли для каждого сервиса. Они входят через корпоративные аккаунты - Okta, Microsoft Entra ID, Google Workspace и т.д.
Именно это делает Single Sign-On (SSO).

Но внедрить SSO непросто: десятки протоколов (SAML, OIDC, SCIM), куча интеграций, каждая со своими нюансами. Это занимает недели и не делает продукт лучше — просто нужно, если хочешь продавать в enterprise.

И вот тут помогает WorkOS.
Вместо десятков интеграций - одна.

Ты подключаешь WorkOS, а он сам работает с нужным провайдером входа.

Когда пользователь нажимает «Sign in with SSO» и вводит домен, WorkOS определяет нужный IdP, перенаправляет на корпоративную страницу входа и возвращает готовый профиль пользователя в твоё приложение.

Плюс есть AuthKit - готовый интерфейс входа с поддержкой паролей, соцсетей, magic-auth и SSO сразу из коробки: https://github.com/workos/authkit

Читать полностью…

C# (C Sharp) programming

🔥 Подборка полезных ресурсов для программистов.

Здесь ты найдёшь всё это - коротко, по делу и без воды.
Пока другие ищут, где “подглядеть решение”, ты уже используешь самые свежие инструменты!

AI: t.me/ai_machinelearning_big_data
Python: t.me/pythonl
Linux: t.me/linuxacademiya
Devops: t.me/DevOPSitsec
Собеседования DS: t.me/machinelearning_interview
C++ t.me/cpluspluc
Docker: t.me/DevopsDocker
Хакинг: t.me/linuxkalii
Data Science: t.me/data_analysis_ml
Javascript: t.me/javascriptv
C#: t.me/csharp_1001_notes
Java: t.me/java_library
Базы данных: t.me/sqlhub
Python собеседования: t.me/python_job_interview
Мобильная разработка: t.me/mobdevelop
Golang: t.me/Golang_google
React: t.me/react_tg
Rust: t.me/rust_code
ИИ: t.me/vistehno
PHP: t.me/phpshka
Android: t.me/android_its
Frontend: t.me/front
Big Data: t.me/bigdatai
МАТЕМАТИКА: t.me/data_math
Kubernets: t.me/kubernetc
Разработка игр: /channel/gamedev
Haskell: t.me/haskell_tg
Физика: t.me/fizmat

💼 Папка с вакансиями: t.me/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: t.me/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: t.me/addlist/eEPya-HF6mkxMGIy
Папка ML: /channel/addlist/2Ls-snqEeytkMDgy
Папка FRONTEND: /channel/addlist/mzMMG3RPZhY2M2Iy
Папка Linux:/channel/addlist/w4Doot-XBG4xNzYy

😆ИТ-Мемы: t.me/memes_prog
🇬🇧Английский: t.me/english_forprogrammers
🧠ИИ: t.me/vistehno

🎓954ГБ ОПЕНСОРС КУРСОВ: @courses
📕Ит-книги бесплатно: /channel/addlist/BkskQciUW_FhNjEy

Сохрани себе, чтобы не потерять!

Читать полностью…

C# (C Sharp) programming

⚡️ Microsoft выпустила Visual Studio 2026 - крупнейшее обновление IDE за последние годы.

🔹 300+ новых функций и почти 5000 исправлений ошибок
🔹 Интеграция с GitHub Copilot стала глубже: теперь он помогает в анализе, рефакторинге и генерации кода
🔹 Редизайн интерфейса — 11 новых цветовых тем, улучшенная навигация и читаемость
🔹 Производительность выросла: количество зависаний интерфейса снизилось на 50 %
🔹 Более 4000 расширений от Visual Studio 2022 полностью совместимы с новой версией

Самое время обновиться - новая версия ощутимо быстрее и умнее.

https://visualstudio.microsoft.com/downloads/

@csharp_ci

Читать полностью…

C# (C Sharp) programming

Основы обобщений (Generics) в C#: классы, интерфейсы, методы и делегаты

Generics — это фундамент гибкого и переиспользуемого кода в C#. На открытом вебинаре курса OTUS C# Developer. Professional Павел Нилов объяснит, как работают обобщения, зачем они нужны и как с их помощью писать код, который не боится масштабирования.

📌 18 ноября, 20:00
Основы обобщений (Generics) в C#
— классы, интерфейсы, методы и делегаты
— ковариантность, контравариантность и ограничения
— эффективное использование List и Dictionary
— примеры и разбор типичных ошибок

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

👉 Регистрируйтесь: https://otus.pw/QTK7/?erid=2W5zFHAbjFE

Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.

Читать полностью…

C# (C Sharp) programming

#ПятничныйКвиз #карательныйсишарп #ВопросИзЗрительногоЗала

Читать полностью…

C# (C Sharp) programming

Невидимые утечки: как находить и обезвреживать сложнейшие утечки памяти в .NET

Даже опытные разработчики не всегда замечают, как события, таймеры и делегаты создают невидимые утечки, удерживая объекты в памяти. На открытом вебинаре курса OTUS C# Developer. Professional Елена Сычева покажет, как такие ошибки возникают и как их находить.

📌 12 ноября, 20:00
Невидимые утечки в .NET
— диагностика скрытых утечек памяти
— разбор работы GC и дампов памяти
— анализ событий, таймеров и делегатов
— реальные примеры из продакшн-кейсов

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

👉 Регистрируйтесь: https://otus.pw/SkLR/?erid=2W5zFJw5xMW

Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.

Читать полностью…

C# (C Sharp) programming

На Stepik вышел курс - Linux: полный апгрейд твоих скиллов

Хочешь реально понимать, что происходит под капотом твоей системы, а не просто кликать по GUI?

Без глубокого знания базы ты не инженер - ты просто пользователь.

🔹 В курсе ты:

- Освоишь bash, grep, sed, awk - инструменты, которыми живут админы.
- Разберёшь права, процессы, сеть, файловую систему и научишься чинить всё, что падает.
- Настроишь SSH, firewall, systemd, crontab, демоны и автозапуск.
- Научишься анализировать логи, следить за нагрузкой, и не паниковать при 100% CPU.

💡 Формат: пошаговое объяснение базы и разбор важных практик по работе с Linux.

🎯 После курса ты: будешь чувствовать Linux как родную среду и забудешь, что такое “permission denied”.

🚀 Сейчас действуют скидка целых - 30%, не упусти реальный шанс прокачаться.

👉 Пройти курс на Stepik

Читать полностью…

C# (C Sharp) programming

Как вы организуете свои Vertical Slices?

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

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

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

По сути:

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

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

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

Читать полностью…

C# (C Sharp) programming

Как сделать .NET-приложения устойчивыми с помощью Polly

Polly — это мощная библиотека для обработки сбоев и нестабильных сетевых вызовов в .NET.
С её помощью можно легко добавить retry, timeout, circuit breaker и другие стратегии отказоустойчивости.

На картинке показан пример, где применяется два ключевых механизма:

1) Retry (повтор запроса при ошибках)
— Обрабатываем конфликты через Handle<ConflictException>()
— Делаем паузу между попытками (`Delay = 1 сек`)
— Используем экспоненциальный backoff
— Добавляем jitter, чтобы избежать «шторма» повторов
— Ограничиваем количество попыток (`MaxRetryAttempts = 2`)

2) Timeout (ограничение времени выполнения)
— Ставим таймаут в 10 секунд на сетевой запрос

Далее создаётся pipeline и выполняется HTTP-запрос:

await pipeline.ExecuteAsync(async ct ⇒ await httpClient.GetAsync("https://modularmonolith.com", ct));

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


https://github.com/App-vNext/Polly

Читать полностью…

C# (C Sharp) programming

🖥 Bash Академия: секреты командной строки, которые нигде не рассказывают

Олег Шелест - профессионал по информационной безопасности, раскрывает скрытые механики Linux, с помощью наглядных картинок и коротких, максимально понятных разборов у себя в тг канале.

- Без воды.
- Без лишней теории.

Только практические приёмы, которые реально используют профи.

Если хочешь уверенно владеть Bash - здесь ты получишь всё, что нужно: t.me/bashmastter

Читать полностью…

C# (C Sharp) programming

Коллекции .NET: взгляд изнутри

Как устроены стандартные коллекции в .NET и почему понимание их внутренней логики помогает писать более производительный код? На открытом вебинаре курса OTUS «C# Developer. Advanced» Антон Герасименко покажет, что происходит «под капотом» List, Dictionary и других структур данных.

📆 4 декабря, 20:00

Коллекции .NET: взгляд изнутри:
— разберём устройство стандартных коллекций
— заглянем в исходный код и объясним, почему они работают именно так
— обсудим, когда стоит реализовать собственную структуру данных

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

👉Зарегистрируйтесь: https://otus.pw/Qrnr/?erid=2W5zFGwFrF2

<div></div><div></div>
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.

Читать полностью…

C# (C Sharp) programming

🛡️ Новая обработка ошибок в .NET 10 - `IExceptionHandler`

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

В .NET 10 появился интерфейс IExceptionHandler, который реализует паттерн try- прямо внутри middleware.

### Как это работает?

✅ Ты сам указываешь, какие типы исключений хочешь перехватывать
✅ Если ты обработал ошибку — возвращаешь true, и цепочка остановится
✅ Можно выстроить несколько обработчиков подряд — они вызовутся по очереди, пока один не справится

📦 Это больше не про громоздкие try-catch или тонны if — теперь всё централизовано и масштабируемо.

🔧 Идеально для:
- Глобальной обработки ошибок
- Разделения логики по типам исключений
- Подключения к логгерам, метрикам, retry-логике

📚 Пример кода и объяснение:


Подходит всем, кто пишет на ASP.NET Core или строит APIЭ

#dotnet #aspnetcore #обработкаошибок #middleware #backend #csharp

Читать полностью…

C# (C Sharp) programming

🧠 EF Core и Repository: когда паттерн мешает, а не помогает

👶 Junior: использует EF Core прямо в контроллере
🧑 Middle: строит BaseRepository, IUnitOfWork, IOrderRepository, IOrderDataAccess...
🧓 Senior: снова использует EF Core — без репозиториев

Почему так?

Сначала Repository Pattern кажется удобным:
4 метода на CRUD — всё аккуратно.
Но как только домен растёт, появляются проблемы:

- Репозиторий на каждую сущность
- Общая логика между сущностями? Куда её девать?
- Репозитории раздуваются до 10+ методов
- Тестируемость становится фикцией: мокаем абстракцию от абстракции

А что насчёт "мы вдруг сменим базу"?

В 99% случаев — не смените.
EF Core и так абстрагирует SQL.
А при переходе на NoSQL придётся переписывать модели, запросы и подход целиком.

А что с "это улучшает разделение ответственности"?

На деле:
- В сервисах висит куча репозиториев
- Общая логика размыта
- Больше обвязки, больше боли, меньше пользы

✅ DbContext уже реализует Repository и Unit of Work.
И это официально указано в исходниках EF Core.

🔥 17 000+ разработчиков уже ушли от репозиториев к практичному использованию EF Core в:
- N-Layered архитектуре
- Clean Architecture
- Vertical Slice
- Specification Pattern
- Интеграционных тестах с in-memory

📖 Подробнее:
https://antondevtips.com/blog/why-you-dont-need-a-repository-in-ef-core

#dotnet #efcore #architecture #backend #repositorypattern

Читать полностью…

C# (C Sharp) programming

10 практических шагах, которые делают запросы EF Core быстрее в 10 раз — и о том, что чаще всего проблема не в EF, а в том, как разработчики его используют.

1️⃣ Добавлять индексы
EF не создаёт их сам. Он рекомендует вручную индексировать колонки из WHERE, JOIN и ORDER BY.

2️⃣ Оптимизировать проекции
Не нужно забирать целую сущность, если нужны 2–3 поля — лучше использовать .Select().

3️⃣ Использовать AsNoTracking для чтения
Отслеживание сущностей расходует память и CPU, поэтому для read-only операций он предлагает .AsNoTracking() или глобальное правило NoTracking.

4️⃣ Аккуратно использовать Include
Слишком много Include приводит либо к N+1, либо к огромным JOIN. Он советует включать только нужные связи.

5️⃣ Избегать больших IN / Contains
Тысячи значений в Contains() превращаются в тяжёлые IN. Лучше бить на батчи или использовать временные таблицы.

6️⃣ Делать пагинацию
Он подчёркивает, что нельзя грузить тысячные выборки целиком: нужны .Skip().Take() или курсорная пагинация.

7️⃣ Использовать скомпилированные запросы
Часто вызываемые запросы можно ускорить через EF.CompileQuery().

8️⃣ Включать SplitQuery
Это помогает избежать «картезианского взрыва», когда много Include создают огромное количество дублирующихся строк.

9️⃣ Писать RAW SQL, если логика сложная
Иногда проще и быстрее использовать FromSqlRaw(), чтобы контролировать план запроса напрямую.

🔟 Использовать кэширование
Часто запрашиваемые данные должны идти из кэша — MemoryCache, Redis или новый HybridCache в .NET 9+.

Бонус:
Перед оптимизацией он советует обязательно измерять узкие места: BenchmarkDotNet, SQL Profiler, планы выполнения.

Ссылка на оригинал

Читать полностью…

C# (C Sharp) programming

✔️ Google подружила Colab с Visual Studio Code.

Компания выпустила расширение, которое напрямую связывает редактор кода со средами выполнения Google Colab. Иными словами, теперь можно работать с локальными .ipynb файлами, но выполнять код на Google Colab. Поддерживается подключение как к бесплатным средам выполнения, так и к премиум-тарифам Colab Pro.

Для начала работы достаточно установить расширение Google Colab из VS Code Marketplace. При выборе ядра для ноутбука появится опция «Colab», после чего нужно будет авторизоваться в аккаунте Google. Расширение также опубликовано в реестре Open VSX для совместимых редакторов.
developers.googleblog.com

Читать полностью…

C# (C Sharp) programming

🔥 Хитрая .NET-задача

Дан код:


public class Fetcher
{
private readonly HttpClient _client = new HttpClient();

public async Task<string> DownloadAsync(string url)
{
await Task.Delay(10);
return await _client.GetStringAsync(url);
}
}

public async Task RunAsync()
{
var fetcher = new Fetcher();
var tasks = Enumerable.Range(0, 5)
.Select(_ => fetcher.DownloadAsync("https://example.com"))
.ToList();

await Task.WhenAll(tasks);

Console.WriteLine("Done");
}


Вопросы:

1) Код может «подвиснуть» или упасть в продакшене.
Какие два скрытых дефекта здесь спрятаны?

2) Как их исправить без изменения сигнатур методов?

3) Почему HttpClient здесь одновременно правильно и неправильно?

4) Что произойдет, если:

заменить HttpClient на HttpClientFactory;

- убрать Task.Delay(10)?

5) Как переписать класс так, чтобы он был:

- потокобезопасным
- быстрым
- без скрытных deadlock-сценариев
- и выдерживал сотни запросов в секунду?

Требования:

- нельзя менять логику RunAsync
- нельзя кэшировать результат
- код должен оставаться асинхронным

Читать полностью…

C# (C Sharp) programming

⚡️ Релиз .NET 10

.NET 10 - свежий LTS-релиз с поддержкой до ноября 2028 года. Платформа стала значительно быстрее благодаря улучшениям в JIT, NativeAOT и поддержке AVX10.2. Добавлена постквантовая криптография, возможность запускать приложения прямо из исходных файлов (например, main.cs), а также новый AI Agent Framework, улучшения в Blazor и расширенная поддержка OpenAPI.

@csharp_ci

Читать полностью…

C# (C Sharp) programming

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

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

Каждый endpoint можно оформлять как отдельную фичу. В одном файле находятся запрос, ответ, обработчик и маршрут — всё компактно и по делу. Такой подход улучшает читаемость и делает зависимости между фичами минимальными.

Пример:


public static class CreateProduct
{
public record Request(string Name, decimal Price);
public record Response(int Id, string Name, decimal Price);

public class Endpoint : IEndpoint
{
public void MapEndpoint(IEndpointRouteBuilder app)
{
app.MapPost("products", Handler).WithTags("Products");
}

public static IResult Handler(Request request, AppDbContext context)
{
var product = new Product { Name = request.Name, Price = request.Price };
context.Products.Add(product);
context.SaveChanges();
return Results.Ok(new Response(product.Id, product.Name, product.Price));
}
}
}


У минимальных API действительно меньше встроенных возможностей, чем у контроллеров, но это решается через middleware, фильтры или библиотеки вроде FastEndpoints, где одну фичу можно определить в одном файле с аккуратным разделением логики.

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

https://milanjovanovic.tech/blog/vertical-slice-architecture-is-easier-than-you-think

Читать полностью…

C# (C Sharp) programming

𝟵𝟬% API на самом деле НЕ RESTful — и почти всегда по одной причине 👇

По модели зрелости Ричардсона REST имеет 4 уровня:

• 0 — просто один эндпоинт, всё через XML/JSON
• 1 — ресурсы с разными URI
• 2 — корректное использование HTTP-методов
• 3 — HATEOAS, когда сам API подсказывает клиенту, какие действия доступны дальше

Проблема в том, что большинство сервисов останавливаются на уровне 2 — то есть формально используют GET/POST/PUT/DELETE, но не дают клиенту навигации через гипермедиа.

Почему почти никто не добавляет HATEOAS:
1. Нужно больше кода
2. Вырастают ответы
3. Нет жёсткого стандарта, как это оформлять
4. Клиент усложняется
5. Кажется оверинжинирингом

Но что происходит без него?
1. Клиент и сервер становятся жёстко связаны
2. Бизнес-логика дублируется на клиенте
3. API плохо открывается и не подсказывает, как по нему ходить

HATEOAS — не обязательный компонент, но именно он делает API настоящим REST, а не просто HTTP поверх JSON.

Здесь разбор, когда это действительно важно и когда нет.

Читать полностью…

C# (C Sharp) programming

Хочешь разобраться с event-driven архитектурой?

Начни с самого простого - событийных уведомлений. В DDD это делается через domain events.

Как это работает:

- В доменной модели есть агрегаты - они отвечают за целостность внутри своих границ.
- Если нужно инициировать действие вне агрегата, он не вызывает его напрямую, а публикует domain event.
- Другие агрегаты подписываются на эти события и реагируют, когда нужно.

Получается слабое связывание: один объект просто сообщает «что произошло», а не «что делать дальше».

Агрегат поднял событие — другие обработали. Чисто, понятно, без прямых зависимостей.

Так строятся системы, которые легко расширять и поддерживать, не превращая код в паутину вызовов.

Event-driven начинается не с Kafka и очередей, а с простого: правильно разделять границы и общаться через события.

Подробнее

Читать полностью…

C# (C Sharp) programming

🔥 EF Core 10 принес нормальные JOIN'ы в LINQ

Больше не нужно вспоминать, как извращаться с GroupJoin + DefaultIfEmpty, чтобы сделать обычный LEFT JOIN.
Теперь есть прямые методы:

✅ LeftJoin
✅ RightJoin

И они делают ровно то, что ты пишешь:
«Оставь все из левой таблицы и подтяни правые записи, если есть совпадения».

Плюсы
- Читаемость выше
- Код короче и очевиднее
- Транслируется в тот же SQL, что и раньше, но без боли

Примерно так LINQ наконец становится ближе к привычному SQL-пониманию разработчика: пишешь join — получаешь join, без магии и обходных путей.

Подробнее про LeftJoin и RightJoin в EF Core 10


#dotnet #efcore #csharp #linq #backend #devtools

Читать полностью…

C# (C Sharp) programming

⚡️ Что выведет код?


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.

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

Читать полностью…

C# (C Sharp) programming

Не пропустите! 06 ноября в 20:00 пройдет бесплатный урок курса “Unity Game Developer. Professional” по теме “ECS: Секретное оружие топовых разработчиков.” Запись: https://otus.pw/c4Lq/

Устал от медленных и запутанных игровых механик? ECS изменит твое представление о разработке игр!

Что вы узнаете:
- Основы ECS — разберем ключевые принципы работы на примере LeoEcsLite
- Сравнение подходов — проведем детальный анализ ООП vs ECS
- Преимущества ECS — узнаем, почему крупные студии выбирают именно эту архитектуру
- Практические кейсы — рассмотрим реальные примеры оптимизации геймплея
- Производительность — разберем, как ECS помогает достичь максимальной эффективности

Записывайтесь на вебинар и получите спец. предложение на обучение:

https://otus.pw/c4Lq/

Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ", ИНН: 9705100963

Читать полностью…
Subscribe to a channel