🚀 HybridCache
Это решение давней проблемы с разделением между
🔧 Что даёт HybridCache:
• Единый API для in-memory и distributed кэша
• Настраиваемая сериализация
• Stampede protection (анти-нагрузочная защита)
• Удаление по тегам
🧠 Как работает
1. Проверяет локальный и распределённый кэш
2. Если нет — вызывает фабричный метод
3. Кэширует результат и возвращает его
🛡️ Stampede protection: только один запрос на ключ запускает фабрику, остальные ждут — никакой гонки или перегрузки БД.
📌 Сниппет на .NET 9 выглядит так:
HybridCache доступен для ASP.NET Core
Все разработчики могут воспользоваться HybridCache для более эффективного управления кэшем в приложениях на ASP.NET Core.
Это решение давней проблемы с разделением между
IMemoryCache
и IDistributedCache
.🔧 Что даёт HybridCache:
• Единый API для in-memory и distributed кэша
• Настраиваемая сериализация
• Stampede protection (анти-нагрузочная защита)
• Удаление по тегам
🧠 Как работает
GetOrCreateAsync
:1. Проверяет локальный и распределённый кэш
2. Если нет — вызывает фабричный метод
3. Кэширует результат и возвращает его
🛡️ Stampede protection: только один запрос на ключ запускает фабрику, остальные ждут — никакой гонки или перегрузки БД.
📌 Сниппет на .NET 9 выглядит так:
app.MapGet("/products/{id}", async (
int id,
HybridCache cache,
ProductDbContext db,
CancellationToken ct) =>
{
var product = await cache.GetOrCreateAsync(
$"product-{id}",
async token =>
{
return await db.Products
.Include(p => p.Category)
.FirstOrDefaultAsync(p => p.Id == id, token);
},
cancellationToken: ct
);
return product is null ? Results.NotFound() : Results.Ok(product);
});
HybridCache доступен для ASP.NET Core
Все разработчики могут воспользоваться HybridCache для более эффективного управления кэшем в приложениях на ASP.NET Core.
Что выведет на экран это код?
Anonymous Quiz
5%
123
24%
456
46%
798
17%
Будет ошибка компиляции.
9%
🔥 Новая эра C# — dotnet run app.cs в .NET 10 Preview 4
Теперь вы можете запускать C#-файлы напрямую, без создания проекта:
📌 Что нового:
Без .csproj — пишите и запускайте C#-код как скрипты.
Директивы в файле:
#:package — подключение NuGet-пакетов.
#:sdk — выбор SDK (например, для ASP.NET).
#:property — установка свойств сборки.
Поддержка shebang — делайте .cs-файлы исполняемыми скриптами в Unix-системах.
🛠 Преимущества:
Быстрый старт без лишних настроек.
Идеально для прототипирования и обучения.
Лёгкий переход от скрипта к полноценному проекту с dotnet project convert.
🔗 Подробнее: devblogs.microsoft.com/dotnet/announcing-dotnet-run-app
@csharp_ci
Теперь вы можете запускать C#-файлы напрямую, без создания проекта:
dotnet run hello.cs
📌 Что нового:
Без .csproj — пишите и запускайте C#-код как скрипты.
Директивы в файле:
#:package — подключение NuGet-пакетов.
#:sdk — выбор SDK (например, для ASP.NET).
#:property — установка свойств сборки.
Поддержка shebang — делайте .cs-файлы исполняемыми скриптами в Unix-системах.
🛠 Преимущества:
Быстрый старт без лишних настроек.
Идеально для прототипирования и обучения.
Лёгкий переход от скрипта к полноценному проекту с dotnet project convert.
🔗 Подробнее: devblogs.microsoft.com/dotnet/announcing-dotnet-run-app
@csharp_ci
🔐 AuthenticationProperties в ASP.NET Core — недооценённый, но важный механизм
Если вы используете куки или OpenID Connect в ASP.NET Core, то наверняка сталкивались с объектом
💡 Что можно сделать с AuthenticationProperties:
• ⏳ Установить срок действия куки:
• ↩️ Указать URL возврата после логина:
• 🧭 Добавить временные метки, элементы состояния, флаги:
Например, IsPersistent, IssuedUtc, AllowRefresh, и кастомные значения.
• 🧠 Используется в:
HttpContext.SignInAsync(...)
ChallengeAsync(...) для OIDC
редиректах после логина/логаута
🛠️ Это ключевой объект, если вы хотите более гибко управлять логикой входа, выхода и жизненным циклом сессии в ASP.NET Core.
📎 Полный разбор:
https://blog.duendesoftware.com/posts/20250527-the-role-of-authenticationproperties-in-aspnet-core
@csharp_ci
Если вы используете куки или OpenID Connect в ASP.NET Core, то наверняка сталкивались с объектом
AuthenticationProperties
. Он не просто "дополнительные параметры" — это мощный инструмент управления поведением аутентификации.💡 Что можно сделать с AuthenticationProperties:
• ⏳ Установить срок действия куки:
new AuthenticationProperties { ExpiresUtc = DateTimeOffset.UtcNow.AddHours(1) }
• ↩️ Указать URL возврата после логина:
new AuthenticationProperties { RedirectUri = "/dashboard" }
• 🧭 Добавить временные метки, элементы состояния, флаги:
Например, IsPersistent, IssuedUtc, AllowRefresh, и кастомные значения.
• 🧠 Используется в:
HttpContext.SignInAsync(...)
ChallengeAsync(...) для OIDC
редиректах после логина/логаута
🛠️ Это ключевой объект, если вы хотите более гибко управлять логикой входа, выхода и жизненным циклом сессии в ASP.NET Core.
📎 Полный разбор:
https://blog.duendesoftware.com/posts/20250527-the-role-of-authenticationproperties-in-aspnet-core
@csharp_ci
🚀 Как ускорить ASP.NET Core API: 6 рабочих приёмов
Если ваш API на .NET тормозит под нагрузкой — вот краткий гайд, как прокачать его производительность. ):
⚡ 1. Async/await везде
Избегай
📉 2. Добавь пагинацию
Не отдавай 10 000 записей за раз. Параметры
🚫 3. Используй `AsNoTracking` в EF Core
Если данные не редактируются — отключай отслеживание изменений. Это экономит память и ускоряет запросы.
📦 4. Включи сжатие ответов
Подключи Gzip или Brotli, особенно если отдаёшь большие JSON-объекты.
🧠 5. Кэшируй часто запрашиваемые данные
Используй
📤 6. Передавай DTO, а не сущности
Не светите внутренними моделями. Создавай DTO и отправляй только нужные поля.
🧪 Подробнее с примерами кода — в оригинальном сайде:
https://dev.to/this-is-learning/tips-for-improving-api-performance-in-aspnet-core-n4o
@csharp_ci
Если ваш API на .NET тормозит под нагрузкой — вот краткий гайд, как прокачать его производительность. ):
⚡ 1. Async/await везде
Избегай
.Result
и .Wait()
— они блокируют потоки. Асинхронность улучшает масштабируемость.📉 2. Добавь пагинацию
Не отдавай 10 000 записей за раз. Параметры
page
и pageSize
— must-have для любых списков.🚫 3. Используй `AsNoTracking` в EF Core
Если данные не редактируются — отключай отслеживание изменений. Это экономит память и ускоряет запросы.
📦 4. Включи сжатие ответов
Подключи Gzip или Brotli, особенно если отдаёшь большие JSON-объекты.
🧠 5. Кэшируй часто запрашиваемые данные
Используй
IMemoryCache
или Redis
— уменьши нагрузку на базу.📤 6. Передавай DTO, а не сущности
Не светите внутренними моделями. Создавай DTO и отправляй только нужные поля.
🧪 Подробнее с примерами кода — в оригинальном сайде:
https://dev.to/this-is-learning/tips-for-improving-api-performance-in-aspnet-core-n4o
@csharp_ci
Что выведет на экран это код?
Anonymous Quiz
26%
Baz Bar Foo Hello
12%
Baz Foo Hello Bar
13%
Baz Hello Foo Bar
29%
Hello Baz Bar Foo
20%
🧩 Blazor и Dependency Injection: лучшие практики и примеры
В Blazor встроена мощная система Dependency Injection (DI), которая помогает создавать модульные и легко тестируемые приложения. Недавно на [Telerik Blog](https://www.telerik.com/blogs/blazor-basics-dependency-injection-best-practices-use-cases) вышла отличная статья с практическими советами по использованию DI в Blazor.
🔧 Типы внедрения зависимостей:
- Constructor Injection: предпочтительный способ для обязательных зависимостей.
- Property Injection: используется для опциональных зависимостей с помощью
- Service Locator: избегайте этого подхода, так как он усложняет тестирование и нарушает принципы DI.
🔄 Варианты времени жизни сервисов:
- Singleton: один экземпляр на всё приложение.
- Scoped: один экземпляр на сессию пользователя.
- Transient: новый экземпляр при каждом запросе.
💡 Рекомендации:
- Используйте интерфейсы для определения зависимостей.
- Избегайте внедрения
- Для управления временем жизни сервисов используйте
📚 Примеры использования:
- Внедрение
- Использование
- Внедрение
📖 Подробнее читайте в статье
@csharp_ci
В Blazor встроена мощная система Dependency Injection (DI), которая помогает создавать модульные и легко тестируемые приложения. Недавно на [Telerik Blog](https://www.telerik.com/blogs/blazor-basics-dependency-injection-best-practices-use-cases) вышла отличная статья с практическими советами по использованию DI в Blazor.
🔧 Типы внедрения зависимостей:
- Constructor Injection: предпочтительный способ для обязательных зависимостей.
- Property Injection: используется для опциональных зависимостей с помощью
@inject
или [Inject]
.- Service Locator: избегайте этого подхода, так как он усложняет тестирование и нарушает принципы DI.
🔄 Варианты времени жизни сервисов:
- Singleton: один экземпляр на всё приложение.
- Scoped: один экземпляр на сессию пользователя.
- Transient: новый экземпляр при каждом запросе.
💡 Рекомендации:
- Используйте интерфейсы для определения зависимостей.
- Избегайте внедрения
Scoped
сервисов в Singleton
сервисы.- Для управления временем жизни сервисов используйте
OwningComponentBase
.📚 Примеры использования:
- Внедрение
HttpClient
для выполнения HTTP-запросов.- Использование
NavigationManager
для управления навигацией.- Внедрение
IJSRuntime
для взаимодействия с JavaScript.📖 Подробнее читайте в статье
@csharp_ci
🔍 Что под капотом у SourceForge: полный стек open-source технологий
SourceForge.net — один из старейших хабов для open-source проектов (основан в 1999), до сих пор остаётся важной платформой для размещения, разработки и распространения ПО. Но что делает его таким устойчивым и масштабируемым?
Компания BlackSlate раскрыла подробности о том, на чём построен SourceForge — и это настоящее пособие по продвинутой архитектуре на Python и open-source инструментах.
🧠 Архитектура SourceForge.net:
✅ Allura — основной backend-фреймворк, написанный на Python.
Он отвечает за всё: трекеры задач, Git/SVN, вики, форумы и многое другое. Код — доступен на GitHub.
⚙️ Технологии под капотом:
🟣 Python — основной язык, на котором написана серверная часть.
🗄 MongoDB — NoSQL база данных для хранения проектов, тикетов, пользователей.
→ ORM: Ming + PyMongo
🔍 Поиск — реализован с помощью Apache Solr + pysolr
→ Поддержка полнотекстового поиска и фильтрации по метаданным
📬 Асинхронные задачи и очереди:
→ RabbitMQ + Kombu — используются для обработки фонов задач
🛠 Git и SVN:
→ GitPython — работа с Git-репозиториями
→ pysvn — управление Subversion
🧩 Веб-фреймворки и middleware:
- TurboGears + Pylons — основа веб-интерфейса
- Paste — WSGI-мидлвари
- Beaker — управление сессиями и кэшами
🎨 UI и шаблоны:
- Jinja2 — шаблонизатор
- Pygments — подсветка синтаксиса в веб-интерфейсе
📦 Окружение и тестирование:
- Vagrant — управление виртуальными dev-средами
- FUSE — файловая система для работы с вложениями и архивами
📌 Почему это важно?
SourceForge — это пример того, как построить надёжную, масштабируемую платформу, полностью на open-source стекe. Без дорогостоящих проприетарных решений — и при этом с полной функциональностью для миллионов проектов и разработчиков.
📎 Полный список технологий:
https://www.blackslate.io/tech-stack/opensource-used-in-sourceforge
Если вы создаёте свою платформу, маркетплейс, dev-инструмент или систему управления проектами — архитектура SourceForge может стать отличным референсом.
@csharp_ci
SourceForge.net — один из старейших хабов для open-source проектов (основан в 1999), до сих пор остаётся важной платформой для размещения, разработки и распространения ПО. Но что делает его таким устойчивым и масштабируемым?
Компания BlackSlate раскрыла подробности о том, на чём построен SourceForge — и это настоящее пособие по продвинутой архитектуре на Python и open-source инструментах.
🧠 Архитектура SourceForge.net:
✅ Allura — основной backend-фреймворк, написанный на Python.
Он отвечает за всё: трекеры задач, Git/SVN, вики, форумы и многое другое. Код — доступен на GitHub.
⚙️ Технологии под капотом:
🟣 Python — основной язык, на котором написана серверная часть.
🗄 MongoDB — NoSQL база данных для хранения проектов, тикетов, пользователей.
→ ORM: Ming + PyMongo
🔍 Поиск — реализован с помощью Apache Solr + pysolr
→ Поддержка полнотекстового поиска и фильтрации по метаданным
📬 Асинхронные задачи и очереди:
→ RabbitMQ + Kombu — используются для обработки фонов задач
🛠 Git и SVN:
→ GitPython — работа с Git-репозиториями
→ pysvn — управление Subversion
🧩 Веб-фреймворки и middleware:
- TurboGears + Pylons — основа веб-интерфейса
- Paste — WSGI-мидлвари
- Beaker — управление сессиями и кэшами
🎨 UI и шаблоны:
- Jinja2 — шаблонизатор
- Pygments — подсветка синтаксиса в веб-интерфейсе
📦 Окружение и тестирование:
- Vagrant — управление виртуальными dev-средами
- FUSE — файловая система для работы с вложениями и архивами
📌 Почему это важно?
SourceForge — это пример того, как построить надёжную, масштабируемую платформу, полностью на open-source стекe. Без дорогостоящих проприетарных решений — и при этом с полной функциональностью для миллионов проектов и разработчиков.
📎 Полный список технологий:
https://www.blackslate.io/tech-stack/opensource-used-in-sourceforge
Если вы создаёте свою платформу, маркетплейс, dev-инструмент или систему управления проектами — архитектура SourceForge может стать отличным референсом.
@csharp_ci
🚀 Вышел .NET 10 Preview 5 — с улучшениями на всех фронтах!
🛠️ В этом обновлении Microsoft прокачала:
• Runtime — улучшена производительность и управление памятью
• C# — новые языковые фичи для более выразительного кода
• ASP.NET Core — оптимизация рендеринга и поддержки HTTP
• Blazor — упрощена работа с интерактивными компонентами
• MAUI — ускорены сборки и улучшена поддержка платформ
• + расширены инструменты диагностики и безопасности
✅ Почему стоит обратить внимание
Серьёзные улучшения в производительности и безопасность
Новые фичи как в Runtime, так и в C#, веб-фреймворках и UI (MAUI)
Продолжение активного развития с учётом обратной связи сообщества
📌 Подробности
📌 Скачать
.NET 10 уже сейчас выглядит как одно из самых амбициозных обновлений в экосистеме.
@csharp_ci
🛠️ В этом обновлении Microsoft прокачала:
• Runtime — улучшена производительность и управление памятью
• C# — новые языковые фичи для более выразительного кода
• ASP.NET Core — оптимизация рендеринга и поддержки HTTP
• Blazor — упрощена работа с интерактивными компонентами
• MAUI — ускорены сборки и улучшена поддержка платформ
• + расширены инструменты диагностики и безопасности
✅ Почему стоит обратить внимание
Серьёзные улучшения в производительности и безопасность
Новые фичи как в Runtime, так и в C#, веб-фреймворках и UI (MAUI)
Продолжение активного развития с учётом обратной связи сообщества
📌 Подробности
📌 Скачать
.NET 10 уже сейчас выглядит как одно из самых амбициозных обновлений в экосистеме.
@csharp_ci
🔥 Успех в IT = скорость + знания + окружение
Здесь ты найдёшь всё это — коротко, по делу и без воды.
Пока другие ищут, где “подглядеть решение”, ты уже используешь самые свежие инструменты!
AI: t.iss.one/ai_machinelearning_big_data
Python: t.iss.one/pythonl
Linux: t.iss.one/linuxacademiya
Собеседования DS: t.iss.one/machinelearning_interview
C++ t.iss.one/cpluspluc
Docker: t.iss.one/DevopsDocker
Хакинг: t.iss.one/linuxkalii
Devops: t.iss.one/DevOPSitsec
Data Science: t.iss.one/data_analysis_ml
Javascript: t.iss.one/javascriptv
C#: t.iss.one/csharp_1001_notes
Java: t.iss.one/java_library
Базы данных: t.iss.one/sqlhub
Python собеседования: t.iss.one/python_job_interview
Мобильная разработка: t.iss.one/mobdevelop
Golang: t.iss.one/Golang_google
React: t.iss.one/react_tg
Rust: t.iss.one/rust_code
ИИ: t.iss.one/vistehno
PHP: t.iss.one/phpshka
Android: t.iss.one/android_its
Frontend: t.iss.one/front
Big Data: t.iss.one/bigdatai
МАТЕМАТИКА: t.iss.one/data_math
Kubernets: t.iss.one/kubernetc
Разработка игр: https://t.iss.one/gamedev
Haskell: t.iss.one/haskell_tg
Физика: t.iss.one/fizmat
💼 Папка с вакансиями: t.iss.one/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: t.iss.one/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: t.iss.one/addlist/eEPya-HF6mkxMGIy
Папка ML: https://t.iss.one/addlist/2Ls-snqEeytkMDgy
Папка FRONTEND: https://t.iss.one/addlist/mzMMG3RPZhY2M2Iy
😆ИТ-Мемы: t.iss.one/memes_prog
🇬🇧Английский: t.iss.one/english_forprogrammers
🧠ИИ: t.iss.one/vistehno
🎓954ГБ ОПЕНСОРС КУРСОВ: @courses
📕Ит-книги бесплатно: https://t.iss.one/addlist/BkskQciUW_FhNjEy
Подпишись, если хочешь быть в числе тех, кого зовут в топовые проекты!
Здесь ты найдёшь всё это — коротко, по делу и без воды.
Пока другие ищут, где “подглядеть решение”, ты уже используешь самые свежие инструменты!
AI: t.iss.one/ai_machinelearning_big_data
Python: t.iss.one/pythonl
Linux: t.iss.one/linuxacademiya
Собеседования DS: t.iss.one/machinelearning_interview
C++ t.iss.one/cpluspluc
Docker: t.iss.one/DevopsDocker
Хакинг: t.iss.one/linuxkalii
Devops: t.iss.one/DevOPSitsec
Data Science: t.iss.one/data_analysis_ml
Javascript: t.iss.one/javascriptv
C#: t.iss.one/csharp_1001_notes
Java: t.iss.one/java_library
Базы данных: t.iss.one/sqlhub
Python собеседования: t.iss.one/python_job_interview
Мобильная разработка: t.iss.one/mobdevelop
Golang: t.iss.one/Golang_google
React: t.iss.one/react_tg
Rust: t.iss.one/rust_code
ИИ: t.iss.one/vistehno
PHP: t.iss.one/phpshka
Android: t.iss.one/android_its
Frontend: t.iss.one/front
Big Data: t.iss.one/bigdatai
МАТЕМАТИКА: t.iss.one/data_math
Kubernets: t.iss.one/kubernetc
Разработка игр: https://t.iss.one/gamedev
Haskell: t.iss.one/haskell_tg
Физика: t.iss.one/fizmat
💼 Папка с вакансиями: t.iss.one/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: t.iss.one/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: t.iss.one/addlist/eEPya-HF6mkxMGIy
Папка ML: https://t.iss.one/addlist/2Ls-snqEeytkMDgy
Папка FRONTEND: https://t.iss.one/addlist/mzMMG3RPZhY2M2Iy
😆ИТ-Мемы: t.iss.one/memes_prog
🇬🇧Английский: t.iss.one/english_forprogrammers
🧠ИИ: t.iss.one/vistehno
🎓954ГБ ОПЕНСОРС КУРСОВ: @courses
📕Ит-книги бесплатно: https://t.iss.one/addlist/BkskQciUW_FhNjEy
Подпишись, если хочешь быть в числе тех, кого зовут в топовые проекты!
🕹️ NET-NES — эмулятор легендарной NES, написанный на C# и Raylib
После создания собственного эмулятора GameBoy (**CODE-DMG**), следующий шаг был очевиден — NES. Консоль, оставившая след не только в истории видеоигр, но и в электронике, вдохновила на создание нового проекта — NET-NES.
🎮 Что такое NET-NES?
Это NES-эмулятор, написанный на C# с использованием Raylib. Он уже способен запускать множество классических хитов от Nintendo.
📜 Немного истории:
• NES (Nintendo Entertainment System) — вышла в Японии как FamiCom в 1983 году
• В 1985 появилась в Северной Америке, где спасла индустрию после видеоигрового краха 1983 года
• Продавалась как "игрушка" — и изменила всё
🧠 Аппаратная часть NES:
• 8-битный CPU Ricoh 2A03 (~1.79 МГц), основанный на MOS 6502
• Встроенный APU (аудио)
• Видео: Ricoh 2C02 — вывод 256×240, палитра 64 цвета
• 2 КБ RAM + 2 КБ VRAM
• ROM‑картриджи с мапперами для расширения памяти и графики
🛠️ Почему C# и Raylib?
• Потому что C# — удобен, современен и любим
• Raylib — весёлый, минималистичный и идеально подходит для 2D-рендера
• А название NET-NES — от .NET и NES, звучит круто 😄
🔗 GitHub: github.com/Paulescu/NET-NES
#nes #dotnet #emulation #gamedev #csharp #retrogaming
@csharp_ci
После создания собственного эмулятора GameBoy (**CODE-DMG**), следующий шаг был очевиден — NES. Консоль, оставившая след не только в истории видеоигр, но и в электронике, вдохновила на создание нового проекта — NET-NES.
🎮 Что такое NET-NES?
Это NES-эмулятор, написанный на C# с использованием Raylib. Он уже способен запускать множество классических хитов от Nintendo.
📜 Немного истории:
• NES (Nintendo Entertainment System) — вышла в Японии как FamiCom в 1983 году
• В 1985 появилась в Северной Америке, где спасла индустрию после видеоигрового краха 1983 года
• Продавалась как "игрушка" — и изменила всё
🧠 Аппаратная часть NES:
• 8-битный CPU Ricoh 2A03 (~1.79 МГц), основанный на MOS 6502
• Встроенный APU (аудио)
• Видео: Ricoh 2C02 — вывод 256×240, палитра 64 цвета
• 2 КБ RAM + 2 КБ VRAM
• ROM‑картриджи с мапперами для расширения памяти и графики
🛠️ Почему C# и Raylib?
• Потому что C# — удобен, современен и любим
• Raylib — весёлый, минималистичный и идеально подходит для 2D-рендера
• А название NET-NES — от .NET и NES, звучит круто 😄
🔗 GitHub: github.com/Paulescu/NET-NES
#nes #dotnet #emulation #gamedev #csharp #retrogaming
@csharp_ci
🧠 C#‑задача с подвохом: как работает `foreach` на изменяемой коллекции?
Представим, у нас есть такой код:
❓ Вопрос: Что произойдёт при запуске?
🔍 Разбор
На первый взгляд — ничего особенного. Но при запуске вы получите:
💣 Почему так?Потому что `foreach` в C# использует **итератор (Enumerator)**, который **не допускает изменений коллекции во время прохода**. Это встроенная защита от непредсказуемых багов и гонок.
✅ Как можно обойти?
Вариант 1 — использовать
Вариант 2 — создать копию коллекции:
🧠 Вывод:
В C# `foreach` нельзя использовать на коллекциях, которые вы планируете менять в теле цикла. Это распространённая ловушка даже для опытных разработчиков.
📎 Советы:
- При изменениях — лучше
- Внимательно читайте исключения:
Поделитесь с коллегами — пусть никто не попадается 😊
@csharp_ci
Представим, у нас есть такой код:
List<int> numbers = new List<int> { 1, 2, 3, 4 };
foreach (var n in numbers)
{
Console.WriteLine(n);
if (n == 2)
numbers.Remove(n); // 😬
}
❓ Вопрос: Что произойдёт при запуске?
🔍 Разбор
На первый взгляд — ничего особенного. Но при запуске вы получите:
1
2
Unhandled exception. System.InvalidOperationException:
Collection was modified; enumeration operation may not execute.
💣 Почему так?
✅ Как можно обойти?
Вариант 1 — использовать
for
вместо foreach
:
for (int i = 0; i < numbers.Count; i++)
{
if (numbers[i] == 2)
{
numbers.RemoveAt(i);
i--; // ⚠️ Обязательно откатить индекс!
}
}
Вариант 2 — создать копию коллекции:
foreach (var n in numbers.ToList())
{
if (n == 2)
numbers.Remove(n);
}
🧠 Вывод:
📎 Советы:
- При изменениях — лучше
for
или .ToList()
- Внимательно читайте исключения:
InvalidOperationException
— ваш друг в отладкеПоделитесь с коллегами — пусть никто не попадается 😊
@csharp_ci
🏗️ Value Objects и DDD в ASP.NET Core — подробный гайд от Telerik
В новом блоге Telerik разбирается ключевой принцип Domain-Driven Design (DDD) — Value Objects — и как грамотно реализовать их в ASP.NET Core.
📌 Что такое Value Object:
• Объект без идентичности
• Сравнивается по значению, а не по ссылке
• Иммутабельный по своей сути
• Является частью бизнес-логики (например,
🛠 В статье:
• Почему использовать Value Objects вместо простых типов
• Как реализовать их в .NET (структура, инварианты, валидация)
• Примеры кода, включая
• Как внедрять их в Entity Framework Core без боли
💡 Отличный материал для тех, кто хочет строить чистую доменную модель и развивать архитектурное мышление.
🔗 Читай статью:
https://www.telerik.com/blogs/domain-driven-design-principles-value-objects-aspnet-core
#DDD #ASPNetCore #ValueObjects #SoftwareArchitecture #Telerik
В новом блоге Telerik разбирается ключевой принцип Domain-Driven Design (DDD) — Value Objects — и как грамотно реализовать их в ASP.NET Core.
📌 Что такое Value Object:
• Объект без идентичности
• Сравнивается по значению, а не по ссылке
• Иммутабельный по своей сути
• Является частью бизнес-логики (например,
Money
, Email
, `Address`)🛠 В статье:
• Почему использовать Value Objects вместо простых типов
• Как реализовать их в .NET (структура, инварианты, валидация)
• Примеры кода, включая
record
, struct
и кастомные value equality • Как внедрять их в Entity Framework Core без боли
💡 Отличный материал для тех, кто хочет строить чистую доменную модель и развивать архитектурное мышление.
🔗 Читай статью:
https://www.telerik.com/blogs/domain-driven-design-principles-value-objects-aspnet-core
#DDD #ASPNetCore #ValueObjects #SoftwareArchitecture #Telerik
🔧 Shift Left с архитектурным тестированием в .NET
Что делать, чтобы ваш модульный (или монолитный) .NET-проект не превратился в «болото кода» спустя пару месяцев? Поможет механизм architecture testing, который позволяет строго контролировать архитектуру прямо в CI-пайплайне.
🎯 Почему это важно
• Технический долг неизбежен: быстрые фиксы, дедлайны, новые участники — архитектура разваливается
• Architecture tests — это сдвиг влево, позволяющий обнаруживать нарушения структуры на ранних этапах разработки
• Это как страховка: если кто-то случайно нарушил архитектурные правила — сборка падает
🧩 Как это работает (на примере NetArchTest)
✅ Можно проверять любой дизайн:
• Модули — должны вызывать друг друга только через public API
• Слои Clean Architecture — например, Domain не должен ссылаться на Infrastructure
• Правила дизайна — все
• Конвенции имен — например, все CommandHandler'ы должны оканчиваться на
🛠 Итого:
• Architecture tests — не просто инструмент, а средство контроля архитектуры
• Работает как компилятор для архитектурных правил — это гарантирует соблюдение структуры
• Идеально подходит для modular monolith, Clean Architecture и крупных систем
• Сдвигает баги из продакшна в CI-пайплайн
🧭 Как начать:
1. Выберите библиотеку (ArchUnitNET, NetArchTest, …)
2. Напишите пару тестов — например, на зависимости между слоями
3. Интегрируйте в CI (GitHub Actions, Azure Pipelines, TeamCity и др.)
4. Соблюдайте — и архитектура останется в целости
🎯 Ключевой вывод
С architecture testing вы не просто «следуете стандартам» — вы автоматизируете дизайн, позволяя команде фокусироваться на логике, а не на структуре. Shift Left не для QA — теперь и архитектура под защитой.
📚 Подробнее
Что делать, чтобы ваш модульный (или монолитный) .NET-проект не превратился в «болото кода» спустя пару месяцев? Поможет механизм architecture testing, который позволяет строго контролировать архитектуру прямо в CI-пайплайне.
🎯 Почему это важно
• Технический долг неизбежен: быстрые фиксы, дедлайны, новые участники — архитектура разваливается
• Architecture tests — это сдвиг влево, позволяющий обнаруживать нарушения структуры на ранних этапах разработки
• Это как страховка: если кто-то случайно нарушил архитектурные правила — сборка падает
🧩 Как это работает (на примере NetArchTest)
// Проверка: Ticketing-модуль не должен зависеть от Users, Events и т.д.
Types.InAssemblies(ticketingAssemblies)
.That().DoNotHaveDependencyOnAny(otherModules)
.Should().NotHaveDependencyOnAny(otherModules)
.GetResult()
.ShouldBeSuccessful();
// Проверка Clean Architecture:
Types.InAssembly(DomainAssembly)
.Should().NotHaveDependencyOn(ApplicationAssembly.GetName().Name)
.GetResult()
.ShouldBeSuccessful();
✅ Можно проверять любой дизайн:
• Модули — должны вызывать друг друга только через public API
• Слои Clean Architecture — например, Domain не должен ссылаться на Infrastructure
• Правила дизайна — все
IDomainEvent
должны быть sealed
• Конвенции имен — например, все CommandHandler'ы должны оканчиваться на
CommandHandler
🛠 Итого:
• Architecture tests — не просто инструмент, а средство контроля архитектуры
• Работает как компилятор для архитектурных правил — это гарантирует соблюдение структуры
• Идеально подходит для modular monolith, Clean Architecture и крупных систем
• Сдвигает баги из продакшна в CI-пайплайн
🧭 Как начать:
1. Выберите библиотеку (ArchUnitNET, NetArchTest, …)
2. Напишите пару тестов — например, на зависимости между слоями
3. Интегрируйте в CI (GitHub Actions, Azure Pipelines, TeamCity и др.)
4. Соблюдайте — и архитектура останется в целости
🎯 Ключевой вывод
С architecture testing вы не просто «следуете стандартам» — вы автоматизируете дизайн, позволяя команде фокусироваться на логике, а не на структуре. Shift Left не для QA — теперь и архитектура под защитой.
📚 Подробнее
Что выведет на экран этот код?
Anonymous Quiz
10%
42 0
30%
42 24
10%
0 24
7%
0 0
32%
Будет ошибка времени выполнения. Нельзя изменять readonly структуры
11%
🔧 OpenSAGE — амбициозный проект по реверс-инжинирингу игрового движка из классических стратегий. Разработчики ставят перед собой сложную задачу: воссоздать с нуля технологию SAGE, которая использовалась в играх EA Pacific, не нарушая авторских прав.
Проект находится на ранней стадии — сейчас ведется работа с форматами данных (.map, .w3d, .ini и другими) и рендерингом. Команда использует интересный подход: вместо декомпиляции исходного кода они анализируют файлы ресурсов и поведение оригинальной игры, что делает проект легальным с точки зрения законодательства.
🤖 GitHub
@csharp_ci
Проект находится на ранней стадии — сейчас ведется работа с форматами данных (.map, .w3d, .ini и другими) и рендерингом. Команда использует интересный подход: вместо декомпиляции исходного кода они анализируют файлы ресурсов и поведение оригинальной игры, что делает проект легальным с точки зрения законодательства.
🤖 GitHub
@csharp_ci
📈 Мониторинг .NET‑приложений с помощью OpenTelemetry и Grafana
Ваше приложение работает в продакшене, но вы не видите, что происходит? Забудьте об угадках — пора включить Observability 🔍
👨💻 В блоге Милана Йовановича рассказывается, как с помощью OpenTelemetry встроить трассировки, метрики и логи прямо в .NET-приложение, а затем визуализировать всё это в Grafana Cloud — без привязки к конкретному вендору
🚦 Быстрые шаги:
- Устанавливаем NuGet пакеты:
- В
- Настраиваем экспорт через OTLP в Grafana Cloud — задаём endpoint и токен
📊 Что получаем:
- Полный стек наблюдаемости: метрики, логи, трассировки в одном интерфейсе
- Графаны Dashboard — красивые дашборды + оповещения при проблемах
- Глубокий анализ: сквозные запросы, задержки, узкие места
🎯 Почему это стоит использовать:
- Вендорно-нейтральное решение — работает с разными платформами
- Начальный уровень бесплатно в Grafana Cloud
- Настройка занимает минимум времени — максимальная отдача
📌 Подробнее
@csharp_ci
Ваше приложение работает в продакшене, но вы не видите, что происходит? Забудьте об угадках — пора включить Observability 🔍
👨💻 В блоге Милана Йовановича рассказывается, как с помощью OpenTelemetry встроить трассировки, метрики и логи прямо в .NET-приложение, а затем визуализировать всё это в Grafana Cloud — без привязки к конкретному вендору
🚦 Быстрые шаги:
- Устанавливаем NuGet пакеты:
OpenTelemetry.Extensions.Hosting
OpenTelemetry.Instrumentation.AspNetCore
OpenTelemetry.Instrumentation.Http
OpenTelemetry.Exporter.OpenTelemetryProtocol
- В
Program.cs
:
builder.Services.AddOpenTelemetry()
.ConfigureResource(r => r.AddService("MyService"))
.WithTracing(t => t
.AddAspNetCoreInstrumentation()
.AddHttpClientInstrumentation()
.AddOtlpExporter()
);
builder.Logging.AddOpenTelemetry(lo => lo.AddOtlpExporter());
- Настраиваем экспорт через OTLP в Grafana Cloud — задаём endpoint и токен
📊 Что получаем:
- Полный стек наблюдаемости: метрики, логи, трассировки в одном интерфейсе
- Графаны Dashboard — красивые дашборды + оповещения при проблемах
- Глубокий анализ: сквозные запросы, задержки, узкие места
🎯 Почему это стоит использовать:
- Вендорно-нейтральное решение — работает с разными платформами
- Начальный уровень бесплатно в Grafana Cloud
- Настройка занимает минимум времени — максимальная отдача
📌 Подробнее
@csharp_ci