C# Portal | Программирование
13.1K subscribers
1.35K photos
132 videos
31 files
1.04K links
Присоединяйтесь к нашему каналу и погрузитесь в мир для C#-разработчика

Сотрудничество, реклама: @devmangx

Работаем с @Spiral_Yuri

РКН: https://clck.ru/3FocB6
Download Telegram
.NET tip: перестаньте прятать DateTime.UtcNow внутри кода.

Вместо этого используйте TimeProvider. В рабочем коде приложение получает реальное время, а в тестах можно использовать fake clock и самостоятельно перемещать время вперёд.

Небольшая абстракция, которая делает тесты гораздо удобнее.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🤯1🍾1
.NET Tip.Select() vs .SelectMany()

Практический пример:

Клиент запросил список всех технологий, которыми владеют ваши сотрудники.

#Dotnet

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
🍾5❤2
Какой самый быстрый способ выполнить SQL bulk insert?

Я протестировал все популярные подходы... Победитель — SqlBulkCopy. Это самый быстрый способ вставить большой объём данных в SQL Server. В PostgreSQL есть команда COPY, которая работает похожим образом.

Вот ещё 5 решений, которые сравнивались: https://milanjovanovic.tech/blog/fast-sql-bulk-inserts-with-csharp-and-ef-core

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4🍾1
Лучший урок по C#, который вы получите сегодня:
(чтобы сократить количество багов на 50%)

Не возвращайте null-коллекции из своих методов. Возвращайте пустые коллекции.

ПЕРЕСТАНЬТЕ:
• Заставлять вызывающий код проверять результат на null
• Засорять код лишними условиями
• Рисковать получить runtime exceptions, которые сложно отследить

НАЧНИТЕ:
• Возвращать new List<T>()
• Возвращать Enumerable.Empty<T>()
• Возвращать [] — collection expression из C# 12

Так код становится безопаснее, чище и понятнее. А остальные пусть продолжают тонуть в null-проверках.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12👎4❤2🍾2❤‍🔥1
Создавайте автономных AI-агентов на C#!

Соберите свой первый multi-agent workflow на .NET с помощью Microsoft AutoGen: agent loops, использование tools и выполнение кода.

Гайд Autonomous AI Agents in C# with AutoGen

#AgenticAI #CSharp #DotNet #AutoGen #AI

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5🔥3🤔2🍾1
Слышали о temporal coupling?

Вот фрагмент кода с распространённым anti-pattern: temporal coupling между сохранением данных и публикацией событий.

Проблема:
❤3🍾2❤‍🔥1
И кто же? 🙂

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
❤13🤣7🕊3💯1🍾1
Если хотите стать лучше как software engineer — освойте background jobs.

Вот почему они помогают создавать более масштабируемые системы.
Допустим, нужно вынести часть работы приложения в background, чтобы она выполнялась независимо от основного application flow.

Несколько примеров:

- Напоминать пользователям о продлении подписки
- Отправлять email после завершения продажи
- Обрабатывать сообщения из очереди
- Удалять устаревшие элементы из cache

В .NET background task можно настроить буквально за несколько минут. Самый простой подход — использовать класс BackgroundService. Начиная с .NET 8, такие background services также можно запускать параллельно.

Если требуется более надёжное и функциональное решение, первый выбор — Quartz.

Подробнее читать здесь.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1🍾1
Бесплатный курс по C# от Microsoft

Microsoft и freeCodeCamp запустили бесплатный курс по C#, для новичков. В программу курса входят: базовые конструкции языка, работа с методами, циклами, условиями, массивами и отладкой кода.

Обучение построено на практических заданиях и мини-проектах, а после прохождения курса можно бесплатно сдать сертификационный экзамен и получить сертификат 🧑‍🏫

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7🍾1
Union Types в C#

Используйте их для представления состояний или результатов, например Success | Failure.

Но будьте осторожны, если они являются частью entity в EF Core: на практике сейчас удобнее использовать discriminated hierarchy.

Главное — сохранить ясность domain-модели, не усложняя persistence.

#dotnet

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🍾2
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5🍾1
.NET позволяет добавить API rate limiting буквально одной строкой кода.

Это отличный способ контролировать использование вашего приложения.

У такого подхода есть как плюсы, так и минусы, но rate limiting может сделать ваши API более надёжными и безопасными.

Это техника, которая позволяет ограничивать количество запросов к серверу или API.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3🍾1
Cокровищница для новичков «Coddy Journeys»

Бесплатная онлайн платформа где вы осваиваете программирование, проходя интерактивные маршруты и решаете задачи прямо в браузере.

Учёба превращается в игру, шаг за шагом к своим первым успехам в IT ❤️

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🍾1
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2🍾1
Saga Pattern в .NET

Если вы разрабатываете distributed systems, этот паттерн обязательно стоит знать.

Saga Pattern помогает поддерживать согласованность данных в длительных процессах, которые затрагивают несколько сервисов. В основе Saga лежит координация потока данных и действий между microservices. Такая координация может быть реализована двумя способами:

• Choreography — каждый сервис самостоятельно взаимодействует с другими для достижения общей цели
• Orchestration — центральный компонент координирует действия всех сервисов

Что происходит, если один из шагов Saga завершается ошибкой?

Об этом часто забывают, поскольку большинство разработчиков пишут код в расчёте на happy path. Однако важно заранее продумать обработку ошибок на каждом этапе Saga. Лучший способ обработки будет зависеть от требований бизнеса.

Как реализовать Saga Pattern в .NET: Гайд по реализации Saga Pattern с MassTransit

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍2🍾1
Как запускать conditional middleware в .NET?

В динамичном мире web-разработки эффективная обработка входящих HTTP requests имеет ключевое значение для создания надёжных и производительных приложений.

Middleware в .NET играет важную роль в обработке этих requests, выступая связующим звеном между server и application. Один из мощных инструментов ASP.NET Core — app.UseWhen, который позволяет разработчикам условно применять middleware в зависимости от заданных критериев.

Преимущества такого подхода:

• Оптимизация производительности
• Более чистая организация кода
• Выборочное применение middleware

app.UseWhen особенно полезен для приложений со специфическими требованиями к routing или обработке requests. Для простых приложений он может быть избыточен, но в более сложных сценариях способен значительно улучшить производительность и организацию кода.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
🍾3❤1👍1
Что такое API Gateway?

Самое простое объяснение: это reverse proxy с дополнительными возможностями. API Gateway — это точка входа для ваших backend services и API. Он выступает промежуточным слоем, принимает client requests и направляет их в нужные сервисы.

Основные возможности API Gateway:

• Request routing и composition
• Authentication и Authorization
• Load balancing
• Rate limiting
• Monitoring
• Caching

Проще всего воспринимать его как reverse proxy с дополнительными обязанностями.

Как реализовать API Gateway в .NET: Гайд по API Gateway с YARP

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍2🍾1
Не получается разобраться с EF Core queries?

По умолчанию EF Core уже логирует SQL, но вместо реальных значений parameters вы увидите плейсхолдеры ?.

Объедините EnableSensitiveDataLogging() с LogTo(), и получите реальные значения parameters прямо в query — именно в том виде, в котором EF отправляет его в базу данных.

optionsBuilder
.LogTo(Console.WriteLine)
.EnableSensitiveDataLogging();


Где это полезно:

• Видны реальные значения parameters вместо ?
• Можно скопировать точный SQL и сразу выполнить его в БД
• Легче обнаружить ситуации, когда EF отправляет неправильный тип или неожиданный NULL

Никогда не включайте это в production. В logs могут попасть чувствительные данные: PII, tokens и keys. Ограничивайте использование через проверку environment, а не через комментарий с напоминанием отключить настройку позже.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2🍾2👏1
Что должно находиться в слоях Clean Architecture?

Clean Architecture — один из самых распространённых подходов к правильному разделению ответственности. Но на практике разработчики часто размещают компоненты не в тех слоях.

Вот что обычно относится к каждому слою:

1) Domain
• Events
• Entities
• Exceptions
• Repository Interfaces

2) Application
• Services
• Behaviours
• Validators
• Queries / Commands

3) Infrastructure
• Email
• Storage
• Background Jobs
• Database — если нет отдельного слоя Persistence
• Repository Implementations — если нет отдельного слоя Persistence

4) Persistence (опционально, если отделён от Infrastructure)
• Database
• Repository Implementations

5) Presentation
• Controllers
• Middlewares
• View Models или Request Models

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤1🍾1
Совет на ближайшие годы — идите в Data Science и ML

Пока ИИ забирает работу у одних специалистов, другие строят на нём карьеру и зарабатывают всё больше. И вопрос уже не в том, изменит ли ИИ рынок, а в том, по какую сторону этих изменений окажетесь вы. DS/ML – один из самых прямых способов оказаться среди тех, кто на этом выигрывает

А чтобы не тратить годы на хаотичное обучение – держите в подписках Data Portal. Там практикующие ML-инженеры понятным языком разбирают главное: новые модели, библиотеки, исследования, датасеты, гайды, курсы и практические кейсы.

Подписывайтесь: @LLMScience
👎13🌚4😁1🤯1🥴1
IAsyncActionFilter недооценивают, хотя это очень мощный инструмент.

В ASP.NET Core filters позволяют выполнять собственную логику до или после определённых этапов request pipeline, не затрагивая controllers.

Есть две основные причины использовать их:

1. Переиспользование — одну и ту же логику можно применять к нескольким controllers или actions.
2. Расширяемость — business rules можно полностью вынести из action methods.

IActionFilter выполняется до и после action method и хорошо подходит для лёгких синхронных проверок. IAsyncActionFilter стоит использовать, когда сама проверка требует await, например обращения к базе данных или внешнему service.

Вместо двух отдельных методов «до» и «после», как в синхронной версии, здесь используется один OnActionExecutionAsync, который оборачивает delegate next(). Вызовите next(), чтобы продолжить pipeline, либо не вызывайте его и установите context.Result, чтобы досрочно завершить обработку request.

// EmailVerifiedFilter.cs
internal sealed class EmailVerifiedFilter(
IUser currentUser,
IUserService userService) : IAsyncActionFilter
{
public async Task OnActionExecutionAsync(
ActionExecutingContext context,
ActionExecutionDelegate next)
{
Guid? userId = currentUser.Id;

if (userId != null &&
!await userService.IsEmailVerifiedAsync(userId))
{
context.Result = new ForbidResult();
return;
}

await next();
}
}

// Program.cs
builder.Services.AddScoped<EmailVerifiedFilter>();

// UsersController.cs
[HttpGet("dashboard")]
[ServiceFilter(typeof(EmailVerifiedFilter))]
public IActionResult GetUserDashboard()
{
...
}


Где этот подход особенно полезен:

• Проверка подтверждения email или подписки
• Проверка business rules перед выполнением action
• Условная блокировка request без early return в каждом action
• Cross-cutting logic, которую иначе пришлось бы копировать в десятки controllers

Для обычных проверок ролей или policies, не требующих обращения к БД, обычно лучше подходит IAsyncAuthorizationFilter. Он выполняется до model binding, поэтому отклонённому request не придётся проходить ненужный этап привязки данных.

👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2🍾1