18377
По всем вопросам- @haarrp C# - обучающий канал Senior C# разработчика. @ai_machinelearning_big_data - Machine learning @itchannels_telegram - 🔥лучшие ит-каналы @csharp_ci - C# академия @pythonlbooks- книги📚 Реестр РКН: https://clck.ru/3Fk3kb
C# 14: задача на Span без аллокаций
Дана строка:
42|john@example.com|127
public readonly record struct UserLog(
int Id,
ReadOnlyMemory<char> Email,
int Latency
);
static bool TryParse(
ReadOnlyMemory<char> input,
out UserLog result
)
var input = "42|john@example.com|127".AsMemory();
if (TryParse(input, out var log))
{
Console.WriteLine(log.Id); // 42
Console.WriteLine(log.Email); // john@example.com
Console.WriteLine(log.Latency); // 127
}
Unity подключила Claude Code, Codex и Grok к разработке игр 🎮
Компания опубликовала официальный плагин с 31 готовым скиллом для Unity 6+.
Агенту можно поручить конкретную задачу обычным текстом:
* создать экран настроек
* подключить внутриигровые покупки
* настроить физику или навигацию
* собрать мультиплеер и голосовой чат
* исправить проблемы со спрайтами
* настроить звук, локализацию, шейдеры и URP
Агент определяет нужную область Unity и загружает соответствующие инструкции. Плагин поддерживает Claude Code, Codex и Grok, устанавливается через их CLI и не содержит MCP-серверов или хуков.
https://github.com/Unity-Technologies/unity-agent-plugin#install
RabbitMQ в Production: Transactional Outbox, идемпотентность и DLQ в ASP.NET Core
Отправить сообщение в RabbitMQ несложно. Гораздо сложнее сделать так, чтобы система продолжала работать корректно в production: сообщения не терялись, не обрабатывались повторно, а ошибки не приводили к бесконечным ретраям и дублированию данных.
На открытом уроке 17 сентября в 20:00 разберем типичные проблемы при построении событийно-ориентированных систем и рассмотрим проверенные подходы к их решению. Поговорим о паттерне Transactional Outbox, идемпотентности, и покажем, как Dead Letter Queue (DLQ) помогает работать с ошибками. Примеры на ASP.NET Core и RabbitMQ, но подходы применимы и к другим брокерам.
Урок для backend-разработчиков, строящих микросервисные архитектуры, и инженеров, желающих довести event-driven системы до промышленной надежности.
👉 Записаться: https://otus.pw/WXVc1/?erid=2W5zFHyvc6m
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
.NET и Владимир: отличный повод совместить митап и выходные в городе с историей
Офлайн-мероприятий для .NET-разработчиков сейчас не так много, а тут получается приятное комбо: встреча с другими разработчиками вечером в пятницу и возможность остаться на выходные в городе с историей.
В программе доклады от разработчиков Altenar и Рови Тех (часть Т-Банка):
— Async/await — асинхронность, которую можно читать.
— Как не терять данные при асинхронной интеграции программных систем.
— EF Core + PostgreSQL: за рамками CRUD.
Кстати, ещё на митапе запланированы активности для программистов: адаптации известных игр ("Сапер", "Крестики-нолики", "Гонки"), где для победы понадобится понимание математики и вероятностей.
Участие бесплатное, а ещё можно сэкономить на проезде — организаторы разыграют несколько билетов на "Ласточку" среди участников.
Для участия в розыгрыше:
1. Зарегистрируйтесь на митап.
2. Напишите «Хочу на .NET-митап на Ласточке» на почту aleksei.korneev@altenar.com с почты, указанной при регистрации.
Итоги розыгрыша подведём 14 сентября.
Регистрируйтесь, планируйте поездку и до встречи во Владимире!
⚡ Refit - удобная альтернатива ручной работе с HttpClient в .NETHttpClient отлично подходит для HTTP-запросов, но при неправильном использовании можно столкнуться с проблемами вроде исчерпания сокетов и некорректного обновления DNS. Плюс сериализацию и разбор ответов часто приходится писать вручную.
Refit упрощает это:
- описываешь REST API обычным C#-интерфейсом
- получаешь type-safe клиент
- сериализация и десериализация выполняются автоматически
- под капотом всё равно используется HttpClient
Удобно для проектов, где много внешних API и не хочется писать повторяющийся HTTP-код.
https://github.com/reactiveui/refit
🚀 Microsoft показала, как переносить старые приложения с .NET Framework на .NET 10 прямо в Visual Studio с помощью GitHub Copilot.
Copilot теперь помогает пройти модернизацию по шагам:
- анализирует старый проект
- составляет план обновления
- показывает контрольные точки перед изменениями
- помогает переписывать несовместимые части
- сохраняет ход миграции в Markdown-файлах
- делает процесс прозрачнее и проще для проверки командой
Идея в том, чтобы превратить большой и рискованный апгрейд в последовательный сценарий, где разработчик видит, что именно меняется и почему.
Полезно для команд, которые годами откладывали переход со старого .NET Framework из-за объёма ручной работы.
https://devblogs.microsoft.com/visualstudio/today-i-will-modernize-a-net-application/
⚡️ Как нормально работать с конфигурацией в .NET
Значения могут приходить из appsettings.json, environment variables, User Secrets и других configuration providers.
Можно читать их напрямую через IConfiguration, но такой код быстро становится хрупким и неудобным.
Вместо этого лучше использовать Options Pattern:
* создать класс настроек
* привязать его к секции конфигурации
* получать через IOptions<T>
* добавить валидацию через Data Annotations
Так конфигурация становится типизированной, проще тестируется и меньше ломается при рефакторинге.
Как упростить работу с иерархическими данными в Blazor
Обычный DropDownList удобен для плоских списков, а TreeView хорошо показывает структуру, но занимает много места.
Telerik предлагает промежуточный вариант - DropDownTree.
Он позволяет выбирать элементы из дерева прямо внутри компактного dropdown:
* категории товаров
* структура компании
* файловая система
* регионы
* роли и permissions
Компонент поддерживает вложенные данные напрямую, поиск по дереву, раскрытие нужных узлов и отображение выбранного пути.
Пример:
<TelerikDropDownTree Data="@Data"
@bind-Value="@SelectedValue"
ValueField="TreeItemId"
Filterable="true">
<DropDownTreeBindings>
<DropDownTreeBinding TextField="Text"
ItemsField="Items" />
</DropDownTreeBindings>
</TelerikDropDownTree>
TreeView на экране нет смысла.
🚀 .NET 8: как сделать микросервисы устойчивыми с Resilience Pipelines + DI
В распределённых системах ошибки — это не исключение, а реальность:
❌ API временно недоступен
❌ сеть дала сбой
❌ сервис перегружен
❌ внешний провайдер отвечает слишком долго
В .NET 8 это стало намного проще благодаря Microsoft.Extensions.Resilience (на базе Polly).
Можно собрать свой ResiliencePipeline и добавить в DI один раз:
✅ Retry — повторить запрос
✅ Timeout — ограничить время ожидания
✅ Circuit Breaker — остановить поток ошибок
✅ Fallback — вернуть запасной результат
✅ Rate Limiter — защитить сервис
✅ Hedging — отправить альтернативный запрос
Главный плюс — не нужно настраивать защиту в каждом месте кода.
Создаёшь pipeline → регистрируешь через DI → используешь где нужно:
var user = await pipeline.ExecuteAsync(
async token => await httpClient.GetAsync("api/users", token)
);
⚡️Актуальные темы .NET на DotNext 2026
В .NET одновременно происходит много интересного: C# получает новые возможности, .NET 10 меняет расклад между Native AOT и JIT, а в разработке появляются ИИ-агенты, которые берут на себя часть инженерной работы.
На DotNext 2026 разберем как вещи, которые происходят на уровне машинного кода, так и вполне прикладные вопросы архитектуры и разработки.
📅 25–26 сентября, Москва + online
Выбрали 8 тем из программы, среди которых не только доклады, но и хардкорный воркшоп, чтобы показать этот диапазон:
— как заставить Transactional Outbox одновременно быть строгим и параллельным;
— зачем ASP.NET Core модульный монолит и как собрать его без микросервисов;
— где Native AOT выигрывает у JIT в .NET 10;
— что происходит с циклами, inlining и bounds checks в C# и Go;
— как меняется SDLC, когда в команде появляются ИИ-агенты;
— что принесут discriminated unions в C# 15;
— как проектировать асинхронное взаимодействие в распределенных системах (воркшоп).
Все подробности — в карточках и на сайте конференции.
🌟По промокоду csharpci — персональные билеты дешевле
→ Программа DotNext
→ Купить билет
🔥 Хочешь быстрее расти в IT? Хватит учиться в одиночку
Окружение решает больше, чем кажется.
Собрал папки и каналы, где можно быстрее влиться в нужное направление, следить за трендами и не вариться в своём пузыре.
AI: t.me/ai_machinelearning_big_data
Python: t.me/pythonl
Linux: t.me/linuxacademiya
Хакинг: t.me/linuxkalii
DevOps: t.me/DevOPSitsec
Docker: /channel/+90Z5TAyfuNU5YmRi
Golang: t.me/Golang_google
Rust: t.me/rust_code
C++: t.me/cpluspluc
C#: t.me/csharp_1001_notes
Java: t.me/javatg
JavaScript: t.me/javascriptv
React: t.me/react_tg
Frontend: t.me/front
PHP: t.me/phpshka
Android: t.me/android_its
Мобильная разработка: t.me/mobdevelop
Базы данных: t.me/sqlhub
Data Science: t.me/data_analysis_ml
Big Data: t.me/bigdatai
Математика: t.me/data_math
Физика: /channel/+S4hinvO3QI43ZjNi
Kubernetes: t.me/kubernetc
GameDev: /channel/gamedev
Haskell: t.me/haskell_tg
Собеседования и карьера:
DS собеседования: t.me/machinelearning_interview
Python собеседования: t.me/python_job_interview
Папка с вакансиями: 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
Полезное сверху:
ИТ-мемы: t.me/memes_prog
Английский для программистов: t.me/english_forprogrammers
ИИ и технологии: t.me/vistehno
954 ГБ open-source курсов: /channel/+rKBQEMccAA01MTcy
ИТ-книги бесплатно: /channel/addlist/BkskQciUW_FhNjEy
Max Ai: https://max.ru/ai_machinelearning_big_data
Max python: https://max.ru/pythonl
ТЕХНО: https://max.ru/vistehno
Max Go: https://max.ru/Golang_google
Max Linux: https://max.ru/linuxkalii
Devops: https://max.ru/DevOPSitsec
C#: https://max.ru/csharp_ci
C++: https://max.ru/cpluspluc
SQL: https://max.ru/sqlhub
Java: https://max.ru/javatg
Подписывайся на нужные направления и собирай себе ленту, которая реально двигает вперёд.
🔥 .NET 11 Preview 7 вышел, и Microsoft заметно прокачала сразу C#, Runtime, ASP.NET Core и SDK
Один из самых интересных апдейтов в C# — labeled break и continue: теперь можно явно указать, из какого цикла выходить или какой цикл продолжать. Ещё появились union patterns и улучшенная проверка исчерпывающих случаев для закрытых иерархий типов.
В Runtime добавили оптимизации async`/`await, включая runtime async tiering и tail-await. Отдельно продолжают развивать NativeAOT и JIT.
В SDK NativeAOT-версия dotnet CLI теперь включена по умолчанию, как и MSBuild Server. У dotnet test появились общий --timeout, ограничение --maximum-failed-tests и поддержка запуска тестов на устройствах .NET MAUI.
ASP.NET Core получил автоматическую приостановку неактивных Blazor circuits, кеширование SSR через CacheView, новые анализаторы Blazor и встроенную локализацию validation-сообщений.
Ещё из приятного: HTTP request compression, API для DNS-записей, парольная защита ZIP, Complex<T>, улучшения LINQ в EF Core и поддержка Half в SQLite.
.NET 11 Preview 7 вышел 11 августа 2026 года и уже доступен для тестирования.
https://devblogs.microsoft.com/dotnet/dotnet-11-preview-7/
Запрограммируй робота на Python и поборись за призовой фонд трека 7 500 000 руб на True Tech Champ 2026.
Попробуй себя в треке по программированию роботов. Начать проще, чем кажется: зарегистрируйся, собери команду или объединись с другими участниками на платформе и пройди квалификационный этап до 13 сентября. В онлайн-симуляторе тебе предстоит запрограммировать робособаку и робота-манипулятора для доставки груза через полосу препятствий. Количество попыток не ограничено, а еще тебя будет ждать серия обучающих вебинаров.
Лучшие команды пройдут в финал и будут программировать реальных роботов на офлайн-полигоне 22 октября на большой сцене.
Масштабный финал объединит борьбу за призовой фонд, выступления хедлайнеров, доклады спикеров и активности для всех гостей мероприятия.
Рекомендуемые стеки: Go, Java, Python, C#, C++, JS.
Успей зарегистрироваться и пройти квалификацию до 13 сентября
Реклама. ООО "МВС", ИНН 7707767501, Erid:2VSb5yvnNti
🔥 Request-response через брокер сообщений в C#: мощный паттерн, который легко превратить в распределённый дедлок
Один сервис отправляет сообщение в RabbitMQ или NATS и ждёт ответ.
Для вызывающего кода это выглядит почти как обычный await, хотя под капотом работают две независимые очереди:
Requester -> request -> Responder
Requester <- response <- Responder
ReplyTo и уникальный CorrelationId, чтобы клиент понял, к какому запросу относится ответ.inbox subject.
var requestId = Guid.NewGuid();
await bus.SendAsync(new PriceRequest(
RequestId: requestId,
ProductId: productId
));
var response = await responses
.WaitForAsync<PriceResponse>(
requestId,
timeout: TimeSpan.FromSeconds(2),
cancellationToken);
CancellationToken;CorrelationId;
Service A ждёт B
Service B ждёт C
Service C ждёт A
## В C# появился safe — но это не аналог Rust
В C# 15 тестируется новый контекстный модификатор safe для кода на границе с нативной памятью.
Главная проблема P/Invoke: компилятор видит сигнатуру метода, но не может проверить, насколько безопасно ведёт себя код внутри подключённой библиотеки. Теперь разработчик должен явно зафиксировать решение:
[LibraryImport("libc")]
internal static safe partial int getpid();
[LibraryImport("libc")]
internal static unsafe partial nuint strlen(byte* value);
safe означает, что вызов не требует `unsafe`-контекста со стороны пользователя API.unsafe предупреждает: безопасность зависит от условий, которые компилятор проверить не может. Такой метод разрешено вызывать только внутри блока:
unsafe
{
nuint length = strlen(pointer);
}
[StructLayout(LayoutKind.Explicit)]
struct Packet
{
[FieldOffset(0)]
public safe long Id;
[FieldOffset(0)]
public unsafe nint Pointer;
}
safe, ни unsafe, компилятор выдаст ошибку при включённых новых правилах безопасности. :contentReference[oaicite:0]{index=0}safe не анализирует нативный код и не доказывает его безопасность. Это явное обещание автора API, которое делает потенциально опасные границы заметными при ревью.unsafe: риск должен быть обозначен в контракте метода и локализован в конкретных участках программы, а не спрятан внутри большого `unsafe`-класса.
🔍Тестовое собеседование с Senior C# разработчиком уже завтра
15 сентября(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle C# разработчика.
Как это будет:
📂 Александр Моргунов, старший C# разработчик с опытом 7+ лет в Европейских высоконагруженных сервисах, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Александр будет комментировать каждый ответ респондента, чтобы дать понять, чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Александру
Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для C# разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_csharp_bot
Реклама.
О рекламодателе.
🔍 Куда Copilot тратит токены и почему тормозит
Барт Вуллемс показал, как отслеживать работу GitHub Copilot через OpenTelemetry и Aspire Dashboard локально.
В панели можно увидеть:
* расход входных и выходных токенов;
* использование кеша промптов;
* длительность запросов к модели;
* вызовы инструментов и время их выполнения;
* какая модель фактически обработала запрос.
Каждый ход агента отображается как цепочка операций. Это помогает понять, где возникла задержка: при генерации ответа, чтении файла, выполнении команды или обращении к MCP-серверу.
В статье - запуск Dashboard, настройки Copilot Chat в VS Code и разбор трассировок. Запись текста промптов и ответов включается отдельно через captureContent.
Статья - https://bartwullems.blogspot.com/2026/09/monitoring-github-copilot-usage-with.html
#GitHubCopilot #Aspire #OpenTelemetry
Запускать локальные LLM в .NET стало удивительно просто
Про AI в разработке обычно говорят в контексте написания кода, но в .NET нейросети уже можно достаточно легко встраивать прямо в приложения.
Через Microsoft.Extensions.AI и Ollama локальную модель можно подключить буквально несколькими строками.
Что можно собрать:
- обычный чат
- суммаризацию текста
- классификацию и категоризацию
- распознавание изображений
- свои AI-фичи без отправки данных во внешний API
Особенно интересно, что всё это можно запускать локально: модель работает на вашей машине, а приложение обращается к ней как к обычному сервису.
Примерно так:
builder.Services.AddChatClient(
new OllamaApiClient(
new Uri("http://localhost:11434"),
"phi3:mini"));
✔️ Polly становится платной, но у .NET остаётся бесплатная альтернатива
Polly много лет была одной из главных библиотек .NET для устойчивости к временным сбоям: retry, timeout, fallback, rate limiting и circuit breaker.
Теперь Polly движется в сторону платной модели, но Microsoft.Resilience по-прежнему можно использовать бесплатно.
С .NET 8 работа с resilience стала заметно проще: появился новый API Polly и официальные библиотеки Microsoft для построения resilience pipelines.
Что можно настроить:
- Retry
- Fallback
- Timeout
- Rate limiting
- Circuit breaker
Хороший разбор того, как собирать устойчивые cloud-приложения на современном .NET:
https://milanjovanovic.tech/blog/building-resilient-cloud-applications-with-dotnet
🧩 Как собрать Excel-подобную таблицу в .NET MAUI через Blazor Hybrid
В статье показывают, как встроить полноценный spreadsheet-интерфейс в .NET MAUI-приложение с помощью Blazor Hybrid.
Что получается:
- таблица в стиле Excel
- редактирование ячеек
- формулы и вычисления
- форматирование
- работа с листами
- импорт и экспорт Excel-файлов
- запуск в desktop/mobile-приложении на .NET MAUI
Полезный пример для тех, кто хочет сделать внутри своего приложения редактор таблиц без разработки всего интерфейса с нуля.
https://syncfusion.com/blogs/post/blazor-spreadsheet-dotnet-maui
ХОЧЕШЬ ПОВЫСИТЬ ГРЕЙД В 2026 ГОДУ? 🚀
Чтобы стать Senior C# разработчиком сегодня, нужно не только знать язык программирования и фреймворки. Нужно уметь строить гибкую архитектуру приложения, которую легко тестировать и менять под задачи бизнеса. Стань экспертом в построении гибкой архитектуры приложения!
👉 Стартуем 7 сентября.
Курс ведет действующий архитектор и Principal Engineer Кирилл Ветчинкин.
Ты научишься:
✅ Разбивать приложение на слои в соответствии с Clean Architecture
✅ Формировать Domain Model и применять тактические паттерны DDD
✅ Реализовывать Use Case как Command/Query
✅ Делать синхронные и асинхронные интеграции, не загрязняя ядро приложения
✅ Писать 3 вида тестов для разных слоев приложения
Полная программа ТУТ 👉 https://microarch.ru/courses/ddd/languages/csharp?utm_source=posev&utm_medium=erid:2Vtzqw4xuPH&utm_campaign=2
А главное — ты с нуля разработаешь и запустишь микросервис, который максимально приближен к реальности "Диспетчеризация заказов на курьеров". Это будет крутым проектом в портфолио или основой для рабочих задач.
А еще:
✅ Проверим все домашки
✅ Поддержим в чате
✅ Проведем живые разборы
✅ Ответим на все вопросы
📕 Сертификат об участии по итогам прохождения курса.
🔥 Не откладывай свой рост на потом: https://microarch.ru/courses/ddd/languages/csharp?utm_source=posev&utm_medium=erid:2Vtzqw4xuPH&utm_campaign=2
Реклама. ИП Ветчинкин К.Е. ИНН: 773376451099 Erid: 2Vtzqw4xuPH
ASP .NET Core API под нагрузкой: как сделать сервис устойчивым к сбоям и росту трафика
Пока пользователей мало, API работает быстро. С ростом нагрузки запросы занимают все ресурсы, повторные обращения увеличивают нагрузку, операции продолжаются после отключения клиента, ошибки во внешних сервисах ведут к каскадным отказам.
На открытом уроке 3 сентября в 20:00 разберём защиту API. Возьмём сервис с проблемами, проведём нагрузочное тестирование, найдём узкие места и поэтапно внедрим механизмы защиты. Сравним результаты после каждого изменения. Поговорим о Rate Limiting, контроле параллельных запросов, CancellationToken, Timeout, Circuit Breaker, кешировании в Redis и предотвращении перегрузки повторными попытками.
Урок для C#-разработчиков Web API, backend-инженеров с растущей нагрузкой и всех, кто хочет перейти к production-практикам.
👉 Записаться: https://tglink.io/7fc850528143e7?erid=2W5zFGannvu
#реклама
О рекламодателе
Microsoft выпустила августовские servicing-обновления для .NET и .NET Framework
Обновления вышли 11 августа 2026 года и включают как security, так и non-security fixes.
Актуальные версии:
- .NET 10.0.11
- .NET 9.0.19
- .NET 8.0.30
В этом месяце Microsoft закрыла сразу несколько уязвимостей в .NET 8, 9 и 10, включая:
- Remote Code Execution
- Elevation of Privilege
- Information Disclosure
- Denial of Service
- Security Feature Bypass
Среди исправлений есть CVE-2026-70354 и CVE-2026-62897, связанные с удалённым выполнением кода.
Обновлены также:
- ASP.NET Core
- Entity Framework Core
- Runtime
- container images
- Linux packages
Для .NET Framework тоже вышли новые security и non-security updates.
Если приложение работает на .NET 8, 9 или 10, августовский servicing update лучше не откладывать, особенно из-за набора security fixes.
Подробнее:
https://devblogs.microsoft.com/dotnet/dotnet-and-dotnet-framework-august-2026-servicing-updates/
#aspnetcore #dotnet
Как ограничить количество запросов к API по IP в ASP.NET Core
Встроенный Rate Limiter позволяет сделать это буквально в несколько строк:
builder.Services.AddRateLimiter(options =>
{
options.AddPolicy("fixed-by-ip", httpContext =>
RateLimitPartition.GetFixedWindowLimiter(
partitionKey: httpContext.Connection.RemoteIpAddress?.ToString(),
factory: _ => new FixedWindowRateLimiterOptions
{
PermitLimit = 10,
Window = TimeSpan.FromMinutes(1)
}));
});
userId.
Появился бесплатный open-source PDF-редактор для Windows, который пытается заменить Adobe Acrobat без подписки.
KillerPDF умеет редактировать текст прямо в PDF, добавлять аннотации и изображения, объединять и разделять страницы, заполнять формы, ставить подписи, печатать и делать OCR. Причём распознавание работает локально через Tesseract, без отправки документов в облако.
Есть и более редкие штуки: восстановление повреждённых PDF, открытие файлов с паролем, выравнивание кривых сканов, perspective correction, ночной режим, split view для двух документов и полноценная работа из командной строки.
Весь редактор упакован примерно в 16 МБ, может работать portable, не требует аккаунта, не собирает телеметрию и не делает phone-home. Проект распространяется под GPLv3.
На GitHub уже около 3,4 тыс. звёзд.
https://github.com/SteveTheKiller/KillerPDF
⚙️ Service Discovery в .NET через Consul можно подключить без самописного резолва адресов и ручного перебора инстансов.
Рабочая схема выглядит так:
Install-Package Steeltoe.Discovery.Consul
builder.Services
.AddServiceDiscovery(o => o.UseConsul());
appsettings.json указываем Consul и параметры сервиса:
"Consul": {
"Host": "localhost",
"Port": 8500,
"Discovery": {
"ServiceName": "reporting-service",
"Hostname": "reporting-api",
"Port": 8080
}
}
builder.Services
.AddHttpClient<ReportingServiceClient>(client =>
{
client.BaseAddress = new Uri("http://reporting-service");
})
.AddServiceDiscovery()
.AddRoundRobinLoadBalancer();
HttpClient ходит не на конкретный IP:port, а на логическое имя сервиса.RoundRobinLoadBalancer распределяет запросы между ними.service name → Consul → healthy instances → load balancing → HTTP request
🚀 C# РАЗРАБОТЧИКИ: перестаньте создавать зависимости вручную
Одна из самых частых ошибок в архитектуре .NET - создавать зависимости прямо внутри класса.
❌ Плохой подход:
var companyRepository = new CompanyRepository();
var customerRepository = new CustomerRepository();
var creditService = new CustomerCreditServiceClient();
Проблемы:
❌ жёсткая связность компонентов
❌ сложно заменить реализацию
❌ трудно писать unit-тесты
❌ нет удобного контроля времени жизни объектов
✅ Лучше использовать Dependency Injection
public class CustomerService(
CompanyRepository companyRepository,
CustomerRepository customerRepository,
CustomerCreditServiceClient creditService)
{
}
Теперь DI-контейнер сам создаёт и передаёт нужные зависимости.
Преимущества:
✅ управление временем жизни (Singleton, Scoped, Transient)
✅ лёгкое использование mock-объектов в тестах
✅ decorators для логирования, кэширования и retry
✅ меньше связности между классами
✅ проще масштабировать и рефакторить проект
Dependency Injection - это не просто возможность ASP.NET Core.
Это один из главных принципов создания чистой, гибкой и поддерживаемой архитектуры C#.
🔥 Ещё 5 приёмов рефакторинга C#, которые стоит знать каждому .NET разработчику:
https://milanjovanovic.tech/blog/5-awesome-csharp-refactoring-tips
💡 C#: заставьте архитектуру ломать CI, если кто-то нарушил правила
Компилятор C# отлично проверяет типы, но ему всё равно, что Application внезапно начал зависеть от Infrastructure.
Code Review тоже не гарантирует, что такое заметят.
Для этого можно использовать Architecture Tests — тесты, которые проверяют не бизнес-логику, а структуру проекта.
Например, через NetArchTest.Rules:
[Fact]
public void Application_Should_Not_Depend_On_Infrastructure()
{
var result = Types
.InAssembly(ApplicationAssembly)
.ShouldNot()
.HaveDependencyOn("MyApp.Infrastructure")
.GetResult();
Assert.True(result.IsSuccessful);
}
Application → Infrastructure
[Fact]
public void Handlers_Should_End_With_Handler()
{
var result = Types
.InAssembly(ApplicationAssembly)
.That()
.ImplementInterface(typeof(ICommandHandler<>))
.Should()
.HaveNameEndingWith("Handler")
.GetResult();
Assert.True(result.IsSuccessful);
}
sealed:
Types
.InAssembly(ApplicationAssembly)
.That()
.HaveNameEndingWith("Service")
.Should()
.BeSealed();
❌ «Application не должен зависеть от Infrastructure»
✅ нарушил архитектуру → тест упал → PR не прошёл
Лето, ИТ-Пикник и музыка известных артистов уже через несколько дней!
8 августа в Коломенском пройдет ИТ-Пикник.
В программе — выступления проекта LAB Антона Беляева, IOWA, Cream Soda, Pompeya, мартина и Совы.
А днем — научпоп-лекции, дискуссии об ИИ и больших языковых моделях, мастер-классы и интерактивы. Полезные знакомства и развлечения тоже будут.
Зарегистрироваться и узнать подробности можно на сайте мероприятия.
В билет входит +1 — можно позвать близких и друзей.
До встречи в месте притяжения ИТ.
C#-приём: точное сложение `double` через алгоритм Кэхэна
При сложении миллионов значений типа double небольшие ошибки округления постепенно накапливаются. Особенно плохо, когда рядом оказываются очень большие и очень маленькие числа.
Обычный вариант:
double sum = 0;
foreach (double value in values)
{
sum += value;
}
public static double KahanSum(ReadOnlySpan<double> values)
{
double sum = 0;
double compensation = 0;
foreach (double value in values)
{
double adjusted = value - compensation;
double next = sum + adjusted;
compensation = (next - sum) - adjusted;
sum = next;
}
return sum;
}
compensation сохраняет часть числа, потерянную при округлении, и возвращает её в следующее сложение.
double[] values = { 0.1, 0.2, 0.3, 0.4 };
double result = KahanSum(values);
ReadOnlySpan<double> позволяет передавать массивы и участки памяти без дополнительных копирований.decimal. А когда нужна скорость double и повышенная численная устойчивость – пригодится Kahan Summation.
Читать полностью…