Какой самый быстрый способ выполнить SQL bulk insert?
Я протестировал все популярные подходы... Победитель — SqlBulkCopy. Это самый быстрый способ вставить большой объём данных в SQL Server. В PostgreSQL есть команда
Вот ещё 5 решений, которые сравнивались: https://milanjovanovic.tech/blog/fast-sql-bulk-inserts-with-csharp-and-ef-core
👉 @KodBlog
Я протестировал все популярные подходы... Победитель — SqlBulkCopy. Это самый быстрый способ вставить большой объём данных в SQL Server. В PostgreSQL есть команда
COPY, которая работает похожим образом.Вот ещё 5 решений, которые сравнивались: https://milanjovanovic.tech/blog/fast-sql-bulk-inserts-with-csharp-and-ef-core
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4🍾1
Лучший урок по C#, который вы получите сегодня:
(чтобы сократить количество багов на 50%)
Не возвращайте
ПЕРЕСТАНЬТЕ:
• Заставлять вызывающий код проверять результат на
• Засорять код лишними условиями
• Рисковать получить runtime exceptions, которые сложно отследить
НАЧНИТЕ:
• Возвращать
• Возвращать
• Возвращать
Так код становится безопаснее, чище и понятнее. А остальные пусть продолжают тонуть в
👉 @KodBlog
(чтобы сократить количество багов на 50%)
Не возвращайте
null-коллекции из своих методов. Возвращайте пустые коллекции.ПЕРЕСТАНЬТЕ:
• Заставлять вызывающий код проверять результат на
null• Засорять код лишними условиями
• Рисковать получить runtime exceptions, которые сложно отследить
НАЧНИТЕ:
• Возвращать
new List<T>()• Возвращать
Enumerable.Empty<T>()• Возвращать
[] — collection expression из C# 12Так код становится безопаснее, чище и понятнее. А остальные пусть продолжают тонуть в
null-проверках.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
Соберите свой первый multi-agent workflow на .NET с помощью Microsoft AutoGen: agent loops, использование tools и выполнение кода.
Гайд Autonomous AI Agents in C# with AutoGen
#AgenticAI #CSharp #DotNet #AutoGen #AI
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5🔥3🤔2🍾1
Если хотите стать лучше как software engineer — освойте background jobs.
Вот почему они помогают создавать более масштабируемые системы.
Допустим, нужно вынести часть работы приложения в background, чтобы она выполнялась независимо от основного application flow.
Несколько примеров:
- Напоминать пользователям о продлении подписки
- Отправлять email после завершения продажи
- Обрабатывать сообщения из очереди
- Удалять устаревшие элементы из cache
В .NET background task можно настроить буквально за несколько минут. Самый простой подход — использовать класс
Если требуется более надёжное и функциональное решение, первый выбор — Quartz.
Подробнее читать здесь.
👉 @KodBlog
Вот почему они помогают создавать более масштабируемые системы.
Допустим, нужно вынести часть работы приложения в background, чтобы она выполнялась независимо от основного application flow.
Несколько примеров:
- Напоминать пользователям о продлении подписки
- Отправлять email после завершения продажи
- Обрабатывать сообщения из очереди
- Удалять устаревшие элементы из cache
В .NET background task можно настроить буквально за несколько минут. Самый простой подход — использовать класс
BackgroundService. Начиная с .NET 8, такие background services также можно запускать параллельно.Если требуется более надёжное и функциональное решение, первый выбор — Quartz.
Подробнее читать здесь.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1🍾1
Бесплатный курс по C# от Microsoft
Microsoft и freeCodeCamp запустили бесплатный курс по C#, для новичков. В программу курса входят: базовые конструкции языка, работа с методами, циклами, условиями, массивами и отладкой кода.
Обучение построено на практических заданиях и мини-проектах, а после прохождения курса можно бесплатно сдать сертификационный экзамен и получить сертификат🧑🏫
👉 @KodBlog
Microsoft и freeCodeCamp запустили бесплатный курс по C#, для новичков. В программу курса входят: базовые конструкции языка, работа с методами, циклами, условиями, массивами и отладкой кода.
Обучение построено на практических заданиях и мини-проектах, а после прохождения курса можно бесплатно сдать сертификационный экзамен и получить сертификат
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7🍾1
Union Types в C#
Используйте их для представления состояний или результатов, например
Но будьте осторожны, если они являются частью entity в EF Core: на практике сейчас удобнее использовать discriminated hierarchy.
Главное — сохранить ясность domain-модели, не усложняя persistence.
#dotnet
👉 @KodBlog
Используйте их для представления состояний или результатов, например
Success | Failure.Но будьте осторожны, если они являются частью entity в EF Core: на практике сейчас удобнее использовать discriminated hierarchy.
Главное — сохранить ясность domain-модели, не усложняя persistence.
#dotnet
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
Это отличный способ контролировать использование вашего приложения.
У такого подхода есть как плюсы, так и минусы, но rate limiting может сделать ваши API более надёжными и безопасными.
Это техника, которая позволяет ограничивать количество запросов к серверу или API.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3🍾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
Если вы разрабатываете distributed systems, этот паттерн обязательно стоит знать.
Saga Pattern помогает поддерживать согласованность данных в длительных процессах, которые затрагивают несколько сервисов. В основе Saga лежит координация потока данных и действий между microservices. Такая координация может быть реализована двумя способами:
• Choreography — каждый сервис самостоятельно взаимодействует с другими для достижения общей цели
• Orchestration — центральный компонент координирует действия всех сервисов
Что происходит, если один из шагов Saga завершается ошибкой?
Об этом часто забывают, поскольку большинство разработчиков пишут код в расчёте на happy path. Однако важно заранее продумать обработку ошибок на каждом этапе Saga. Лучший способ обработки будет зависеть от требований бизнеса.
Как реализовать Saga Pattern в .NET: Гайд по реализации Saga Pattern с MassTransit
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 —
Преимущества такого подхода:
• Оптимизация производительности
• Более чистая организация кода
• Выборочное применение middleware
👉 @KodBlog
В динамичном мире web-разработки эффективная обработка входящих HTTP requests имеет ключевое значение для создания надёжных и производительных приложений.
Middleware в .NET играет важную роль в обработке этих requests, выступая связующим звеном между server и application. Один из мощных инструментов ASP.NET Core —
app.UseWhen, который позволяет разработчикам условно применять middleware в зависимости от заданных критериев.Преимущества такого подхода:
• Оптимизация производительности
• Более чистая организация кода
• Выборочное применение middleware
app.UseWhen особенно полезен для приложений со специфическими требованиями к routing или обработке requests. Для простых приложений он может быть избыточен, но в более сложных сценариях способен значительно улучшить производительность и организацию кода.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
Самое простое объяснение: это 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
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍2🍾1
Не получается разобраться с EF Core queries?
По умолчанию EF Core уже логирует SQL, но вместо реальных значений parameters вы увидите плейсхолдеры
Объедините
Где это полезно:
• Видны реальные значения parameters вместо
• Можно скопировать точный SQL и сразу выполнить его в БД
• Легче обнаружить ситуации, когда EF отправляет неправильный тип или неожиданный
Никогда не включайте это в production. В logs могут попасть чувствительные данные: PII, tokens и keys. Ограничивайте использование через проверку environment, а не через комментарий с напоминанием отключить настройку позже.
👉 @KodBlog
По умолчанию EF Core уже логирует SQL, но вместо реальных значений parameters вы увидите плейсхолдеры
?.Объедините
EnableSensitiveDataLogging() с LogTo(), и получите реальные значения parameters прямо в query — именно в том виде, в котором EF отправляет его в базу данных.optionsBuilder
.LogTo(Console.WriteLine)
.EnableSensitiveDataLogging();
Где это полезно:
• Видны реальные значения parameters вместо
?• Можно скопировать точный SQL и сразу выполнить его в БД
• Легче обнаружить ситуации, когда EF отправляет неправильный тип или неожиданный
NULLНикогда не включайте это в production. В logs могут попасть чувствительные данные: PII, tokens и keys. Ограничивайте использование через проверку environment, а не через комментарий с напоминанием отключить настройку позже.
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
Clean Architecture — один из самых распространённых подходов к правильному разделению ответственности. Но на практике разработчики часто размещают компоненты не в тех слоях.
Вот что обычно относится к каждому слою:
1) Domain
• Events
• Entities
• Exceptions
• Repository Interfaces
2) Application
• Services
• Behaviours
• Validators
• Queries / Commands
3) Infrastructure
• Storage
• Background Jobs
• Database — если нет отдельного слоя Persistence
• Repository Implementations — если нет отдельного слоя Persistence
4) Persistence (опционально, если отделён от Infrastructure)
• Database
• Repository Implementations
5) Presentation
• Controllers
• Middlewares
• View Models или Request Models
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤1🍾1
Совет на ближайшие годы — идите в Data Science и ML
Пока ИИ забирает работу у одних специалистов, другие строят на нём карьеру и зарабатывают всё больше. И вопрос уже не в том, изменит ли ИИ рынок, а в том, по какую сторону этих изменений окажетесь вы. DS/ML – один из самых прямых способов оказаться среди тех, кто на этом выигрывает
А чтобы не тратить годы на хаотичное обучение – держите в подписках Data Portal. Там практикующие ML-инженеры понятным языком разбирают главное: новые модели, библиотеки, исследования, датасеты, гайды, курсы и практические кейсы.
Подписывайтесь: @LLMScience
Пока ИИ забирает работу у одних специалистов, другие строят на нём карьеру и зарабатывают всё больше. И вопрос уже не в том, изменит ли ИИ рынок, а в том, по какую сторону этих изменений окажетесь вы. 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 не придётся проходить ненужный этап привязки данных.Please open Telegram to view this post
VIEW IN TELEGRAM
❤2🍾1
Начните использовать эту отличную библиотеку для валидации:
FluentValidation — мощная библиотека, широко используемая в мире .NET. Она предоставляет гибкие возможности для валидации, включая множество встроенных validators и возможность создавать собственные правила.
Установить FluentValidation можно через NuGet Package Manager Console. Validator можно создать, унаследовав класс от
Есть несколько способов зарегистрировать зависимости validators:
• Manual
• Automatic
Когда количество validators растёт, ручная регистрация становится неудобной. В таком случае можно перейти на автоматический подход — он самостоятельно найдёт validators и зарегистрирует их зависимости.
При автоматической регистрации сканируется вся assembly и регистрируются найденные validators. По умолчанию их зависимости регистрируются с lifetime
Использовать validator можно через dependency injection, внедрив
В зависимости от ситуации можно использовать
👉 @KodBlog
FluentValidation — мощная библиотека, широко используемая в мире .NET. Она предоставляет гибкие возможности для валидации, включая множество встроенных validators и возможность создавать собственные правила.
Установить FluentValidation можно через NuGet Package Manager Console. Validator можно создать, унаследовав класс от
AbstractValidator из FluentValidation.Есть несколько способов зарегистрировать зависимости validators:
• Manual
• Automatic
Когда количество validators растёт, ручная регистрация становится неудобной. В таком случае можно перейти на автоматический подход — он самостоятельно найдёт validators и зарегистрирует их зависимости.
При автоматической регистрации сканируется вся assembly и регистрируются найденные validators. По умолчанию их зависимости регистрируются с lifetime
Scoped, но при необходимости lifetime можно изменить, а также настроить, нужно ли включать internal-типы.Использовать validator можно через dependency injection, внедрив
IValidator<T> для нужного класса. ValidateAsync() запускает процесс валидации, а свойство IsValid позволяет определить, прошла ли она успешно.В зависимости от ситуации можно использовать
Validate() или ValidateAsync(). Если валидация не прошла, подробности об ошибках доступны в свойстве Errors результата.👉 @KodBlog
👍5❤4🍾1