C# 1001 notes
6.56K subscribers
358 photos
9 videos
2 files
327 links
Регулярные короткие заметки по C# и .NET.

Просто о сложном для каждого.

admin - @haarrp
Download Telegram
🖥 Полезный Совет по Visual Studio:

Когда вы создаете метод, который возвращает JSON через raw string literal, добавьте

/* lang=json*/

Этот момент нигде не задокументирован.

Если в JSON будет синтаксическая ошибка вроде пропущенной запятой, Visual Studio подсветит её.
Please open Telegram to view this post
VIEW IN TELEGRAM
Управление зависимостями в ASP.NET Core: меньше рутины, больше автоматизации.

Ручное добавление сервисов через AddScoped и AddSingleton превращает Program.cs в бесконечный список регистраций. Но есть способ проще — библиотека Scrutor.

На открытом вебинаре курса OTUS C# ASP.NET Core разработчик Михаил Дмитриев покажет, как автоматизировать регистрацию сервисов и расширить стандартный IoC контейнер.

📌 18 ноября, 20:00
Управление зависимостями в ASP.NET Core с помощью Scrutor
— массовая регистрация сервисов по правилам
— использование паттерна декоратор
— добавление кэширования без переписывания кода
— реальные примеры для продакшн-проектов

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

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

Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
⚡️ Когда стоит применять паттерн Idempotent Consumer?

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

Производитель может частично решить проблему: многие брокеры (Azure Service Bus, Amazon SQS) сами отбрасывают дубликаты, если у сообщения есть уникальный MessageId.

Но у потребителя ответственность больше.
Паттерн Idempotent Consumer предотвращает повторные побочные эффекты:

1. Перед обработкой проверяем локальную таблицу с ключом (MessageId, ConsumerName).
2. Если записи нет - выполняем логику, коммитим транзакцию и записываем факт обработки.
3. Если запись уже есть - сообщение повторное, просто выходим.

Что делать с внешними сервисами?
Некоторые поддерживают idempotency key (например, email-сервисы), и тогда повторный запрос просто игнорируется.
Если сервис это не умеет, можно сохранять намерение локально и выполнять действие отдельным надёжным процессом.

Важно: не все обработчики нуждаются в этом паттерне.
Если операция сама по себе безопасна при повторе (обновить статус, пересобрать кэш) — дополнительные проверки не нужны.

Используйте Idempotent Consumer там, где повторное выполнение может привести к деньгам, ошибкам или сбоям в бизнес-логике.

milanjovanovic.tech/blog/the-idempotent-consumer-pattern-in-dotnet-and-why-you-need-it
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Быстрый совет для Cursor

Хочешь, чтобы Cursor писал точнее и в твоём стиле?

🧠 Просто создай файл `.cursorrules` в корне проекта и опиши в нём:
- правила кодстайла, которые ты используешь
- предпочтения по структуре, форматированию, именованию

Чем конкретнее, тем лучше работает автогенерация.

🔥 Это помогает избежать «галлюцинаций» и потери контекста при создании кода.