Обновить
128K+

.NET *

Хаб со знаниями про .NET

92,31
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности

Паттерны и подходы разработки, о которых все говорят — на примере .NET

Уровень сложностиСредний
Время на прочтение19 мин
Охват и читатели6.2K

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

Я Александр Середин, ведущий разработчик в «БАРС Груп», в этой статье покажу путь от библиотеки классов до Web API и по шагам разберу, что мы используем (Composition Root, Dependency Injection, Generic Host, Options, HTTP‑pipeline) в .NET — как использовать их в качестве фундамента, а не пытаться изобретать собственные велосипеды.

Читать далее

Новости

Как я устал вести ИТ‑активы в Excel и написал свой ITAM/CMDB

Уровень сложностиСредний
Время на прочтение13 мин
Охват и читатели5K

Любой ИТ‑отдел рано или поздно приходит к таблице.

Сначала она выглядит безобидно: инвентарный номер, пользователь, кабинет, модель компьютера, серийный номер. Потом туда добавляются мониторы, принтеры, картриджи, счета, договоры, лицензии, гарантия, комментарии, история ремонтов, перемещения между отделами, списание, выдача, возврат, кто кому что передал и почему у нас опять «где‑то был такой же блок питания».

Через какое‑то время это уже не таблица, а маленькая самописная CMDB, только без связей, истории, прав доступа, нормального поиска и уверенности, что данным можно доверять.

В какой‑то момент я понял, что мне нужна не просто «ещё одна база компьютеров», а единая система для повседневной работы ИТ‑службы: техника, пользователи, документы, счета, лицензии, картриджи, удалённая поддержка, история изменений и автоматическая инвентаризация. Так появился Admin Desk.

Это не статья в стиле «я сделал идеальную систему». Скорее рассказ о том, почему простая задача учёта техники быстро превращается в продукт, где самое сложное — не CRUD, а связи между объектами, история, права, эксплуатация и удобство для реального администратора.

Читать далее

Аллокации, которых нет в коде: охота на скрытый боксинг в .NET 10

Время на прочтение11 мин
Охват и читатели6.1K

Вы написали struct ради zero-allocation, прошли code review — а в проде Gen0-коллекции всё равно идут косяком. Самая дорогая аллокация та, которой нет в исходниках: компилятор молча упаковывает ваш value-тип в кучу там, где вы этого не просили.

Разбираю, где скрытый боксинг живёт и на .NET 10 (интерфейс на struct, foreach по IEnumerable, ValueType.Equals, params object[], замыкания), а где рантайм его уже вырезал — и почему слепо чинить HasFlag по гайдам 2015 года вредно. Два прод-кейса, шпаргалка-таблица, бенчмарк на BenchmarkDotNet и охота на box через DOTNET_JitDisasm и dotnet-gcdump.

Читать далее

Apache Camel под .NET, разбор по косточкам: HTTP-коннектор без ASP.NET MVC + паттерн Content-Based Router

Уровень сложностиСложный
Время на прочтение32 мин
Охват и читатели8.3K

Серия: redb ecosystem / redb.Route deep-dive

В redb.Route — нашем ESB в стиле Apache Camel под .NET — маршрут всегда читается одинаково: From(источник) → [процессоры] → To(приёмник). Сегодня берём один простой паттерн интеграции и один коннектор и разбираем оба до самого дна.

Читать далее

Кешируем отдачу картинок в .NET MVC Core

Уровень сложностиСредний
Время на прочтение6 мин
Охват и читатели6K

Всем привет. В этой статье хочу поделиться опытом добавления клиентского кеширования картинок в ASP.NET MVC Core приложении. В мире SaaS экономия машинных ресурсов - актуальная задача, которая тем актуальнее, чем больше клиентов обслуживается на "единицу железа" (если можно так выразиться). Традиционно, генерация и отдача картинок на бэкенде - достаточно CPU и memory-емкие операции, и добавление клиентского кеша с помощью HTTP заголовков Cache-Control помогает снизить нагрузку на железо.

Читать далее

Две базы: одна пишет, другая читает. CQRS без культа и с последствиями

Уровень сложностиПростой
Время на прочтение5 мин
Охват и читатели9K

Одна база пишет, другая читает: как CQRS, Kafka и Outbox ускоряют запросы, но приносят lag, дубли и eventual consistency

Читать далее

MAX Light — легкая версия клиента MAX для ПК Windows

Уровень сложностиПростой
Время на прочтение7 мин
Охват и читатели7.3K

Многие не хотят пользоваться официальной версией Макса для ПК. Немудрено, он требователен к ресурсам, некоторые даже говорят, что «эта тварь жрёт ресурсов больше, чем 1С». Он постоянно обновляется с полной переустановкой, а на момент написания статьи полный пакет официального Макса весит 308 мб. Наконец, он следит за пользователем.

Написал облегчённый клиент — пользуйтесь. Ссылка в статье.

Читать далее

Generic Repository<T> обещал три вещи — не сдержал ни одной и забрал доменную модель

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели11K

Сколько раз вы реально меняли базу под приложением? Generic Repository – первое, что тащат в проект, и последнее, в чём сомневаются, – держат ровно ради этого. У меня за карьеру смена базы случилась дважды, и оба раза репозиторий полетел в корзину вместе со всем слоем. Это лишь первое из трёх обещаний, которое он не сдержал, а по дороге тихо забрал доменную модель. Как именно – на реальном кейсе с Mongo, и чем мы его заменили.

Читать далее

Библиотека EMX Controls для Avalonia UI — Обновление 1.4 — Июнь 2026

Уровень сложностиПростой
Время на прочтение4 мин
Охват и читатели7.7K

Друзья, приветствуем вас! Наступило долгожданное лето. И, пока все не ушли в отпуска, мы спешим с новым анонсом. Сегодня у нас вышла версия 1.4 библиотеки EMX Controls для Avalonia UI.

Читать далее

Локализация .NET-игры на коленке (devlog игровой разработки)

Время на прочтение2 мин
Охват и читатели6.7K

Продолжаю рассказывать о разработке своей интерактивной книги в формате «симулятора поддержки людей, столкнувшихся с аномально-криповым». В этот раз поговорим о локализации, но почти исключительно с технической точки зрения. Т.е., посмотрим что и как переводить или не переводить, а не «где нанять переводчика / какой ИИшкой лучше переводить».

Читать далее

RMS: упрощаем сотрудникам жизнь в поиске Internet-ID

Уровень сложностиПростой
Время на прочтение5 мин
Охват и читатели6.7K

Привет! Я — Саша Басун, инженер направления пользовательских ИТ-сервисов в «Петрович-Тех». Сегодня я пришёл к вам с историей о том, как вывод значения ключа из реестра Windows может упростить обработку заявок в отделе технической поддержки.

Если коротко: помощь со стороны нашей техподдержки нередко начиналась с мема «Давайте поможем Даше найти Internet-ID на рабочем столе». Тут нет-нет, да все стадии от гнева до принятия пройти придётся. В итоге после заявки, которая пришла уже мне, родилось маленькое, но изящное решение на C#. 

Читать далее

Натягиваем сову на глобус или оценка применимости разработанной методики определения грейда на другие языки

Уровень сложностиСредний
Время на прочтение5 мин
Охват и читатели9.3K

Привет, Хабр! В прошлых статьях я описала, как через нововведенный параметр TSI теоретически можно определить грейд разработчика.

Читать далее

Как я написал BGP-сервер и не сошёл с ума

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели10K

BGPLite — open-source BGP route-server на C# и .NET 10. Он принимает BGP-сессии, динамически загружает префиксы через RIPE Stat и управляется через HTTP API. В статье разберём архитектуру проекта и реализацию собственного BGP-сервера с нуля.

Читать далее

Ближайшие события

Интеграция ИИ уровня предприятия: встраивание LLM в бизнес-процессы крупных компаний — redb.Route.Llm 3.1.1

Уровень сложностиСложный
Время на прочтение29 мин
Охват и читатели9.6K

redb экосистема

В предыдущей статье я анонсировал redb.Route.Llm как 24-й транспорт redb.Route — мы делали LLM ещё одним endpoint'ом наравне с Kafka, RabbitMQ и HTTP, чтобы выкинуть отдельную «AI-инфраструктуру», стоящую рядом с интеграционной. Заодно я повесил в конец статьи «честный skip-list» — список того, что в 3.1.0 ещё не доделано: streaming, ToolCacheStore, KnowledgeStore, BatchStore, EvalRunStore, sliding-window память, sandbox-инструменты.

Из этого skip-list'а делано больше, чем я планировал. Но не это главное. Главное — что в процессе доделывания обнаружилась настоящая ценность всей затеи: LLM-транспорт оказался не очередным чат-фреймворком, а недостающим звеном в ESB, после которого «бизнес-агент в проде» перестаёт быть отдельным проектом. Эта статья — про то, как чат-демо превращается в enterprise-агентскую платформу, не переписываясь и не превращаясь в «AI-монолит сбоку».

Всё, что ниже — реальный код из репозитория, не псевдокод. Ссылки на демо-маршруты в конце.

Читать далее

Инкрементальный парсер на c#

Уровень сложностиПростой
Время на прочтение19 мин
Охват и читатели8.1K

Создаю собственный DSL на C#: рассказываю о том, как инкрементальный парсер. И наконец-то будет использовать одно из преимуществ рослиновской модели синтаксиса.

Читать далее

Быстрый поиск причин сбоев в логах с помощью EventId в .NET Core на примере актов для единого реестра интернет-рекламы

Время на прочтение10 мин
Охват и читатели6.3K

Привет, Хабр! На связи Андрей Алексеенко, техлид оператора рекламных данных (ОРД) «МедиаСкаут». В предыдущем посте мы начали рассказывать о том, как своевременно передаем информацию в единый реестр интернет-рекламы (ЕРИР) — показали настройку гарантированной доставки данных внешним сервисам. Сегодня предлагаю пойти дальше и обсудить, что мы сделали, чтобы вовремя находить, локализовать и устранять проблему, если по какой-то причине (а их множество, и потому разбирать нет смысла) доставка все же не случилась.

Речь о наблюдаемости за системой, которая держится на трех принципах: логирование, трассировка, метрики. В материале разберем механизм контекста структурированного логирования и посмотрим на примерах, как использовать EventId в .NET Core для классификации событий в логах, чтобы быстро понимать, где и что сломалось. Итак, поехали!

Читать дальше

Механизм создания многосегментных компонентов WPF на примере 7 и 16 сегментов

Уровень сложностиСредний
Время на прочтение4 мин
Охват и читатели5.7K

В данной статье разбирается, как реализовать пользовательский многосегментный WPF компонент. Это может содействовать в изучении внутреннего устройства C#, .NET и самой платформы WPF. Разработанное решение дает множество гибких настроек, использовать латинские символы, цифры, кириллицу и работать через MVVM для привязки свойств зависимостей.

Читать далее

Kafka в проде: как встроенное сжатие спасло кластер, когда retention не успевал чистить диск

Уровень сложностиСложный
Время на прочтение12 мин
Охват и читатели8.7K

Привет, Хабр! Меня зовут Павел, я ведущий разработчик. В этой статье расскажу про Kafka, consumer groups, lag, offset commit и встроенное сжатие сообщений. Не в формате “что такое Kafka за 15 минут”, а через обычную продовую историю, где кластер начал есть диск быстрее, чем политики очистки успевали его освобождать.

Снаружи проблема выглядела банально: Kafka живет, producer’ы пишут, consumer’ы читают, retention настроен. Внутри было веселее: в пиковую нагрузку место на брокерах улетало так бодро, будто у него был отдельный KPI на исчезновение. Retention вроде бы должен был чистить старые данные, но он не маг. Если входящий поток крупных сообщений быстрее, чем Kafka успевает освобождать сегменты, диск все равно закончится. А когда диск заканчивается у Kafka, настроение портится не только у Kafka.

В итоге мы пришли к встроенному сжатию Kafka на producer’ах. Без ручного zip payload, без “давайте завернем JSON в архив и пусть каждый consumer теперь разбирается сам”. Просто включили compression на уровне Kafka-клиента. В нашем случае объем сообщений на хранении уменьшился примерно в 5 раз. Это не отменило необходимость следить за retention, lag и consumer groups, но дало кластеру перестать жить в режиме “еще один пик, и пишем посмертную”.

Читать далее

redb.Route 3.1.0 — LLM как ещё один транспорт: .To(«llm://claude») и .AsLlmTool()

Уровень сложностиСредний
Время на прочтение15 мин
Охват и читатели6.7K

Серия: redb ecosystem (анонс, разбор позже)

В 3.1.0 у redb.Route вышло два новых транспортаredb.Route.Llm (24-й) и redb.Route.Exec (25-й). LLM теперь — обычный endpoint наравне с Kafka, RabbitMQ и HTTP: вызов модели — это шаг .To("llm://claude"), инструмент агента — это маршрут с .AsLlmTool("shell"), периодический агент — From("llm://factory?schedule=5m"). Exec — спавнер процессов с allowlist, working-dir и таймаутом; работает и как backend shell-инструментов агента, и как самостоятельный scheduled consumer (cron-less health-probes, бэкапы и т.п.). Никаких «отдельных AI-фреймворков рядом с ESB»: всё внутри той же DSL, тех же retry/throttle/circuit-breaker/audit, тех же OpenTelemetry-трейсов.

Это анонс. Подробный разбор внутренностей — отдельной статьёй позже. Здесь — что появилось, как это выглядит в коде, и что честно ещё не сделано.

Если читаете про redb.Route впервые — короткий контекст из предыдущих статей серии:

redb.Route — Apache Camel для .NET — зачем вообще, и почему «Apache Camel под .NET»

redb.Route изнутри: четыре in-memory канала и Exchange — как устроен runtime

redb.Route 3.0.1 — плоская навигация по DSL, рефакторинг CRTP и тихий null — предыдущий патч перед 3.1.0

Самое короткое объяснение

From("kafka://orders") .To(Llm.Factory("claude").Temperature(0.2).MaxTokens(1024).AsUri()) .To("kafka://orders.translated");

Читать далее

Anti-corruption Layer на C#: три шва на проекте миграции с Rails

Уровень сложностиСредний
Время на прочтение13 мин
Охват и читатели11K

Anti-corruption layer в учебниках выглядит как одна аккуратная коробка между чужой системой и вашей: всё чужое остаётся снаружи, внутрь проходит только то, что уже переведено на язык вашего домена. Граница ровная, как по линейке. Почти за год, что мы вытесняли 10-летний Rails-монолит на .NET, такой ровной границы я не увидел ни разу – ни у себя, ни, кажется, у кого-то ещё на живом проекте.

Понятно это стало в первую же неделю. Мы открыли таблицу exercises и нашли в одной JSONB-колонке 14 разных форм одного типа задания, слепленных за 10 лет. Смаппить это в новые DTO как есть – и новая модель отрастит ровно ту же форму, что у Rails. “Нужен ACL”, подумали мы. Только, как выяснилось на практике, не один.

Читать далее
1
23 ...