В C# для сравнения строк без учета регистра лучше использовать
string.Equals с OrdinalIgnoreCase, а не ToLower() / ToUpper().
▪Почему?
Корректность
Иногда использование
ToLower/Upper может привести к неправильным результатам в некоторых языках (например на Турецком).Удобство чтения
Использование
string.Equals дает понять, что вы выполняете сравнение.Производительность
string.Equals более эффективен, поскольку ему не нужно создавать новый экземпляр строки, как это делает
ToLower/Upper.#dotnet #csharp
@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
Почитать больше о предварительной версии 1 и присоединяйтесь к обсуждению на GitHub Discussions: https://github.com/dotnet/core/discussions/9167
#dotnet #csharp
@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
📌 Релиз
#dotnet #sqlserver
@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
Множество отличных рекомендаций о том, как правильно использовать Async на плохих и хороших примерах.
Сохраняйте себе в закладки.
https://github.com/davidfowl/AspNetCoreDiagnosticScenarios/blob/master/AsyncGuidance.md
#dotnet
@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
🎊 Сегодня были выпущены новые версии .NET 9.0.1 и 8.0.12
https://github.com/dotnet/announcements/issues/341
#dotnet #aspnetcore #efcore #csharp
@csharp_ci
https://github.com/dotnet/announcements/issues/341
#dotnet #aspnetcore #efcore #csharp
@csharp_ci
🚀 .NET 10 Preview 3 уже доступен!
Новая версия приносит мощное обновление для C# — Extension Members:
💡 Теперь можно добавлять в static class расширения не только методов, но и:
▪ 🔹 Статические методы
▪ 🔹 Инстанс-свойства
▪ 🔹 Статические свойства
📦 Это значит, что вы можете "расширять" поведение типов не только логикой, но и дополнительными данными и даже стейтфул-логикой (через свойства).
И всё это — без изменения исходного класса.
🔗 Подробнее:
https://github.com/dotnet/core/blob/main/release-notes/10.0/preview/preview3/csharp.md#extension-members
#dotnet #csharp #dotnet10 #devtools #preview
@csharp_ci
Новая версия приносит мощное обновление для C# — Extension Members:
💡 Теперь можно добавлять в static class расширения не только методов, но и:
▪ 🔹 Статические методы
▪ 🔹 Инстанс-свойства
▪ 🔹 Статические свойства
📦 Это значит, что вы можете "расширять" поведение типов не только логикой, но и дополнительными данными и даже стейтфул-логикой (через свойства).
И всё это — без изменения исходного класса.
🔗 Подробнее:
https://github.com/dotnet/core/blob/main/release-notes/10.0/preview/preview3/csharp.md#extension-members
#dotnet #csharp #dotnet10 #devtools #preview
@csharp_ci
🚀 Релиз: SQL Formatting Preview в T-SQL Analyzer CLI
В последнем обновлении инструмента T-SQL Analyzer CLI от ErikEJ появилась функция предварительного просмотра форматирования SQL-кода.
✨ Основные возможности:
Автоматическое форматирование T-SQL скриптов с использованием встроенных правил.
Интеграция с анализатором кода, позволяющая одновременно проверять и форматировать скрипты.
Поддержка командной строки, что удобно для автоматизации процессов и интеграции в CI/CD пайплайны.
🔧 Пример использования:
Эта команда проанализирует и отформатирует указанный SQL-скрипт согласно установленным правилам.
📌 Подробнее о новых возможностях и инструкциях по установке читайте в официальной документации.
#sqlserver #tsql #dotnet #cli #devtools
https://github.com/ErikEJ/SqlServer.Rules/tree/master/tools/SqlAnalyzerCli#sql-formatting-preview
@csharp_ci
В последнем обновлении инструмента T-SQL Analyzer CLI от ErikEJ появилась функция предварительного просмотра форматирования SQL-кода.
✨ Основные возможности:
Автоматическое форматирование T-SQL скриптов с использованием встроенных правил.
Интеграция с анализатором кода, позволяющая одновременно проверять и форматировать скрипты.
Поддержка командной строки, что удобно для автоматизации процессов и интеграции в CI/CD пайплайны.
🔧 Пример использования:
tsqlanalyze -i "C:\scripts\proc.sql" --formatЭта команда проанализирует и отформатирует указанный SQL-скрипт согласно установленным правилам.
📌 Подробнее о новых возможностях и инструкциях по установке читайте в официальной документации.
#sqlserver #tsql #dotnet #cli #devtools
https://github.com/ErikEJ/SqlServer.Rules/tree/master/tools/SqlAnalyzerCli#sql-formatting-preview
@csharp_ci
📚 Модернизация .NET веб-приложений с помощью DotVVM и новой книги Томаша Герцега
В свежем выпуске подкаста [The .NET Core Show](https://dotnetcore.show/season-7/dotnet-web-app-modernization-made-easy-with-tomas-hercegs-new-book-and-dotvvm/) Томаш Герцег — Microsoft MVP и автор фреймворка DotVVM — рассказывает, как безболезненно обновлять устаревшие .NET-приложения.
🔧 Что такое DotVVM
DotVVM — это open-source MVVM-фреймворк, предназначенный для поэтапной миграции с ASP.NET Web Forms на современный .NET:
- Позволяет переписывать старые приложения постепенно, без необходимости полного рефакторинга
- Поддерживает .NET Framework и .NET Core
- Совместим с существующей кодовой базой, не нарушая архитектуру
DotVVM выступает как мост между устаревшими технологиями и современным стеком, позволяя сохранять бизнес-логику и UI.
🎧 Слушать эпизод подкаста:
https://dotnetcore.show/season-7/dotnet-web-app-modernization-made-easy-with-tomas-hercegs-new-book-and-dotvvm/
#DotVVM #DotNet #WebForms #ASPNet #Modernization #TomasHerceg #SoftwareDevelopment #LegacyToModern
В свежем выпуске подкаста [The .NET Core Show](https://dotnetcore.show/season-7/dotnet-web-app-modernization-made-easy-with-tomas-hercegs-new-book-and-dotvvm/) Томаш Герцег — Microsoft MVP и автор фреймворка DotVVM — рассказывает, как безболезненно обновлять устаревшие .NET-приложения.
🔧 Что такое DotVVM
DotVVM — это open-source MVVM-фреймворк, предназначенный для поэтапной миграции с ASP.NET Web Forms на современный .NET:
- Позволяет переписывать старые приложения постепенно, без необходимости полного рефакторинга
- Поддерживает .NET Framework и .NET Core
- Совместим с существующей кодовой базой, не нарушая архитектуру
DotVVM выступает как мост между устаревшими технологиями и современным стеком, позволяя сохранять бизнес-логику и UI.
🎧 Слушать эпизод подкаста:
https://dotnetcore.show/season-7/dotnet-web-app-modernization-made-easy-with-tomas-hercegs-new-book-and-dotvvm/
#DotVVM #DotNet #WebForms #ASPNet #Modernization #TomasHerceg #SoftwareDevelopment #LegacyToModern
This media is not supported in your browser
VIEW IN TELEGRAM
🧹 Разделение классов на отдельные файлы в ReSharper — автоматически
Если вы работаете с большими C#‑файлами, где собрано по 3–5 классов в одном месте, ReSharper теперь позволяет разнести все классы по отдельным файлам в один клик.
🔧 Что умеет:
▪️ Автоматически определяет все вложенные классы, интерфейсы, enum’ы
▪️ Создаёт новые `.cs`‑файлы с соответствующими именами
▪️ Упрощает навигацию и соблюдение best practices
📌 Где искать:
Refactor This → Move to Separate Files
или
Context Action (Alt+Enter) → Move All Types to Separate Files
📎 Инструкция от JetBrains:
https://www.jetbrains.com/help/resharper/Move_classes_into_separate_files_in_one_go.html
💡 Подходит для чистки легаси-кода и ускорения навигации в больших проектах .NET.
#CSharp #ReSharper #Refactoring #JetBrains #DotNet #DevTools #CodeQuality
Если вы работаете с большими C#‑файлами, где собрано по 3–5 классов в одном месте, ReSharper теперь позволяет разнести все классы по отдельным файлам в один клик.
🔧 Что умеет:
▪️ Автоматически определяет все вложенные классы, интерфейсы, enum’ы
▪️ Создаёт новые `.cs`‑файлы с соответствующими именами
▪️ Упрощает навигацию и соблюдение best practices
📌 Где искать:
Refactor This → Move to Separate Files
или
Context Action (Alt+Enter) → Move All Types to Separate Files
📎 Инструкция от JetBrains:
https://www.jetbrains.com/help/resharper/Move_classes_into_separate_files_in_one_go.html
💡 Подходит для чистки легаси-кода и ускорения навигации в больших проектах .NET.
#CSharp #ReSharper #Refactoring #JetBrains #DotNet #DevTools #CodeQuality
🕹️ 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
⚙️ Background Jobs в ASP.NET Core — просто и эффективно
Хочешь запускать периодические задачи в фоне? В ASP.NET Core это можно реализовать с помощью
🧱 Основные шаги:
1. ✅ Включаем конкурентный запуск/остановку сервисов:
2. 🌀 Реализуем фоновую задачу:
📌 Особенности:
-
-
- Встроенный контроль остановки через
💡 Подходит для:
• Регулярных проверок
• Очистки кэша
• Периодических sync-задач
#aspnetcore #dotnet #backgroundjobs #csharp #dev
Хочешь запускать периодические задачи в фоне? В ASP.NET Core это можно реализовать с помощью
BackgroundService и PeriodicTimer. Ни Hangfire, ни Quartz не нужны, если всё просто.🧱 Основные шаги:
1. ✅ Включаем конкурентный запуск/остановку сервисов:
builder.Services.Configure<HostOptions>(o =>
{
o.ServicesStartConcurrently = true;
o.ServicesStopConcurrently = true;
});
2. 🌀 Реализуем фоновую задачу:
public class PeriodicBackgroundTask : BackgroundService
{
private readonly TimeSpan _period = TimeSpan.FromSeconds(5);
private readonly ILogger<PeriodicBackgroundTask> _logger;
public PeriodicBackgroundTask(ILogger<PeriodicBackgroundTask> logger)
{
_logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
using PeriodicTimer timer = new PeriodicTimer(_period);
while (!stoppingToken.IsCancellationRequested &&
await timer.WaitForNextTickAsync(stoppingToken))
{
_logger.LogInformation("Executing PeriodicBackgroundTask");
}
}
}
📌 Особенности:
-
BackgroundService — стандартный способ запускать фоновые задачи в ASP.NET Core -
PeriodicTimer — простой способ повторять с задержкой - Встроенный контроль остановки через
CancellationToken💡 Подходит для:
• Регулярных проверок
• Очистки кэша
• Периодических sync-задач
#aspnetcore #dotnet #backgroundjobs #csharp #dev
📘 Обновлённый обзор C#: история версий и ключевые новшества
Microsoft опубликовала подробную хронологию C# — от версии 1.0 до последней, показывая эволюцию языка за 20+ лет:
🕰️ Обзор ключевых этапов:
• C# 1.0–2.0 — классика: базовые ООП, exception-обработка, типы значений,
• C# 3.0 — революция LINQ,
• C# 4.0 —
• C# 5.0 —
• C# 6.0 — улучшения синтаксиса: string interpolation, expression-bodied members, null-условные выражения
• C# 7.x —
• C# 8.0 — nullable reference types,
• C# 9.0 —
• C# 10 — глобальные
• C# 11 — raw string literals, generic math, pattern matching improvements
• C# 12 и далее — ожидаются расширенные метапрограммирование, списочные выражения, улучшения в безопасность и производительности
🔧 Почему это важно:
• Язык постоянно развивается, становясь выразительнее, безопаснее и удобнее
• Новые версии дают мощные инструменты — для асинхронного программирования, функционального стиля и более чистого кода
• Понимание изменений помогает быстрее адаптироваться к трендам и выбирать актуальный инструментальный стек
💡 Если вы разрабатываете на C#, стоит ознакомиться с историей версий — и понять, какие фичи уже доступны, а что стоит ожидать в будущем.
👉 Подробнее
@csharp_ci
#dotnet #csharp #programming #developer #language #whatsnew #technology
Microsoft опубликовала подробную хронологию C# — от версии 1.0 до последней, показывая эволюцию языка за 20+ лет:
🕰️ Обзор ключевых этапов:
• C# 1.0–2.0 — классика: базовые ООП, exception-обработка, типы значений,
generics • C# 3.0 — революция LINQ,
lambda`-выражения, автоматические свойства, `var • C# 4.0 —
dynamic, улучшения COM и переговорчивость аннотации • C# 5.0 —
async/await — асинхронность для всех • C# 6.0 — улучшения синтаксиса: string interpolation, expression-bodied members, null-условные выражения
• C# 7.x —
tuples, pattern matching, ref locals, out variables • C# 8.0 — nullable reference types,
ranges/indices, асинхронные потоки • C# 9.0 —
record, init-only properties, top-level statements • C# 10 — глобальные
using, file-scoped namespace, улучшенные структуры • C# 11 — raw string literals, generic math, pattern matching improvements
• C# 12 и далее — ожидаются расширенные метапрограммирование, списочные выражения, улучшения в безопасность и производительности
🔧 Почему это важно:
• Язык постоянно развивается, становясь выразительнее, безопаснее и удобнее
• Новые версии дают мощные инструменты — для асинхронного программирования, функционального стиля и более чистого кода
• Понимание изменений помогает быстрее адаптироваться к трендам и выбирать актуальный инструментальный стек
💡 Если вы разрабатываете на C#, стоит ознакомиться с историей версий — и понять, какие фичи уже доступны, а что стоит ожидать в будущем.
👉 Подробнее
@csharp_ci
#dotnet #csharp #programming #developer #language #whatsnew #technology
Microsoft.Extensions.AI (Preview) — единый способ подключать ИИ в .NET
Библиотеки Microsoft.Extensions.AI призваны упростить жизнь .NET-разработчикам, которые начинают использовать генеративный ИИ в своих приложениях.
🧱 Вместо разрозненных SDK для каждого провайдера — единые "AI building blocks", которые можно подключать и переключать между OpenAI, Azure, Hugging Face и другими.
📦 Что даёт:
– Единый интерфейс для разных AI-провайдеров
– Простая интеграция в pipeline .NET-приложения
– Расширяемая архитектура: можно добавлять собственные провайдеры
– Поддержка RAG-сценариев, чат-интерфейсов, промптинга, трансформаций данных и т.д.
Полезно и для ASP.NET-приложений, и для десктопа, и для фона.
🧪 Пока в превью — но уже можно попробовать:
https://github.com/dotnet/ai-samples?tab=readme-ov-file#microsoftextensionsai-preview
#dotnet #ai #ml #microsoft
@csharp_ci
Библиотеки Microsoft.Extensions.AI призваны упростить жизнь .NET-разработчикам, которые начинают использовать генеративный ИИ в своих приложениях.
🧱 Вместо разрозненных SDK для каждого провайдера — единые "AI building blocks", которые можно подключать и переключать между OpenAI, Azure, Hugging Face и другими.
📦 Что даёт:
– Единый интерфейс для разных AI-провайдеров
– Простая интеграция в pipeline .NET-приложения
– Расширяемая архитектура: можно добавлять собственные провайдеры
– Поддержка RAG-сценариев, чат-интерфейсов, промптинга, трансформаций данных и т.д.
Полезно и для ASP.NET-приложений, и для десктопа, и для фона.
🧪 Пока в превью — но уже можно попробовать:
https://github.com/dotnet/ai-samples?tab=readme-ov-file#microsoftextensionsai-preview
#dotnet #ai #ml #microsoft
@csharp_ci
🔥 Одна из дучших фишек в ASP.NET Core 10 — Server-Sent Events (SSE)
Теперь можно реализовать real-time обновления без SignalR и WebSockets. SSE — это лёгкий способ стримить данные с сервера на клиент *в одну сторону*, идеально для простых задач.
📡 Зачем это нужно?
В .NET-приложениях часто нужно передавать обновления с backend на frontend. Есть несколько способов:
• Polling — клиент всё время спрашивает: «что нового?» (нагружает сервер)
• SignalR — bidirectional WebSockets, но избыточно для простых стримов
• SSE — простой и нативный способ отправлять обновления *односторонне*
Теперь SSE доступен прямо в .NET 10 (preview) и легко интегрируется с Minimal APIs.
🧠 Что сегодня показали:
— Как работает SSE и чем отличается от SignalR
— Как реализовать SSE endpoint с Minimal API
— Как тестировать SSE-поток из IDE (HTTP request file)
— Как собрать frontend для отображения стриминга
— И как создать *живой рынок акций* на SSE — от бэкенда до клиента
👨💻 Отличная альтернатива, если нужно real-time, но без всей сложности WebSockets.
#dotnet #aspnetcore #SSE #ServerSentEvents #SignalR #realtime #webdev
Теперь можно реализовать real-time обновления без SignalR и WebSockets. SSE — это лёгкий способ стримить данные с сервера на клиент *в одну сторону*, идеально для простых задач.
📡 Зачем это нужно?
В .NET-приложениях часто нужно передавать обновления с backend на frontend. Есть несколько способов:
• Polling — клиент всё время спрашивает: «что нового?» (нагружает сервер)
• SignalR — bidirectional WebSockets, но избыточно для простых стримов
• SSE — простой и нативный способ отправлять обновления *односторонне*
Теперь SSE доступен прямо в .NET 10 (preview) и легко интегрируется с Minimal APIs.
🧠 Что сегодня показали:
— Как работает SSE и чем отличается от SignalR
— Как реализовать SSE endpoint с Minimal API
— Как тестировать SSE-поток из IDE (HTTP request file)
— Как собрать frontend для отображения стриминга
— И как создать *живой рынок акций* на SSE — от бэкенда до клиента
👨💻 Отличная альтернатива, если нужно real-time, но без всей сложности WebSockets.
#dotnet #aspnetcore #SSE #ServerSentEvents #SignalR #realtime #webdev
⚡ .NET 9 — самая быстрая платформа 2025 года
Microsoft прокачала .NET так, что он обгоняет почти все популярные фреймворки: Java, Go, Node.js, Python и даже PHP.
🚀 Что сделали:
- Мусорщик (GC) стал адаптивным → меньше пауз даже при высоких нагрузках.
- JIT-компилятор быстрее разогревает код и оптимизирует горячие участки.
- Векторизация через AVX10 и Arm SVE ускоряет циклы в несколько раз.
- Native AOT уменьшает размер бинарников и ускоряет запуск (контейнеры, IoT, edge).
- Сеть (сокеты, HTTP/3) стала работать быстрее с низкой задержкой.
- JSON обрабатывается через System.Text.Json максимально эффективно.
- Меньше аллокаций → меньше нагрузка на память и GC.
- Thread-pool и многопоточность лучше распределяют задачи по ядрам.
- Минимальные API и оптимизация исключений дали ещё +15% к скорости.
📊 Бенчмарки показывают:
- Java (Spring) — медленнее в 2.5 раза
- Go (Fiber) — в 1.3 раза
- Node.js (Fastify) — в 4 раза
- Python (FastAPI) — в 10 раз
- PHP (Laravel) — в 15 раз
- Ruby (Rails) — в 20 раз
💡 Итог: .NET 9 — быстрый старт, низкая задержка и топ-производительность. Отличный выбор для веба, микросервисов и облака.
#dotnet #performance #benchmark #backend
Microsoft прокачала .NET так, что он обгоняет почти все популярные фреймворки: Java, Go, Node.js, Python и даже PHP.
🚀 Что сделали:
- Мусорщик (GC) стал адаптивным → меньше пауз даже при высоких нагрузках.
- JIT-компилятор быстрее разогревает код и оптимизирует горячие участки.
- Векторизация через AVX10 и Arm SVE ускоряет циклы в несколько раз.
- Native AOT уменьшает размер бинарников и ускоряет запуск (контейнеры, IoT, edge).
- Сеть (сокеты, HTTP/3) стала работать быстрее с низкой задержкой.
- JSON обрабатывается через System.Text.Json максимально эффективно.
- Меньше аллокаций → меньше нагрузка на память и GC.
- Thread-pool и многопоточность лучше распределяют задачи по ядрам.
- Минимальные API и оптимизация исключений дали ещё +15% к скорости.
📊 Бенчмарки показывают:
- Java (Spring) — медленнее в 2.5 раза
- Go (Fiber) — в 1.3 раза
- Node.js (Fastify) — в 4 раза
- Python (FastAPI) — в 10 раз
- PHP (Laravel) — в 15 раз
- Ruby (Rails) — в 20 раз
💡 Итог: .NET 9 — быстрый старт, низкая задержка и топ-производительность. Отличный выбор для веба, микросервисов и облака.
#dotnet #performance #benchmark #backend
❌ Exceptions ≠ Errors
Многие разработчики путают эти понятия и проектируют приложения неправильно. Давайте разберём:
Что такое исключение (exception)?
Это ситуация, из которой приложение не может восстановиться.
Пример: критическая ошибка базы данных, повреждённый файл конфигурации.
Что такое ошибка (error)?
Это ожидаемое состояние сбоя или невыполненное предусловие.
Пример: пользователь ввёл неверный пароль, файл не найден, запрос не прошёл валидацию.
👉 Использовать исключения вместо ошибок = анти-паттерн. Так появляется flow control через исключения, который делает код непредсказуемым и запутанным.
Как правильно:
- Ошибки представляем явно в коде (например, через
- Исключения оставляем для действительно неожиданных и фатальных ситуаций.
Бонус: Явные ошибки делают намерения кода прозрачными и облегчают поддержку.
📖 Подробнее: https://milanjovanovic.tech/blog/functional-error-handling-in-dotnet-with-the-result-pattern
#dotnet #cleanCode #architecture
Многие разработчики путают эти понятия и проектируют приложения неправильно. Давайте разберём:
Что такое исключение (exception)?
Это ситуация, из которой приложение не может восстановиться.
Пример: критическая ошибка базы данных, повреждённый файл конфигурации.
Что такое ошибка (error)?
Это ожидаемое состояние сбоя или невыполненное предусловие.
Пример: пользователь ввёл неверный пароль, файл не найден, запрос не прошёл валидацию.
👉 Использовать исключения вместо ошибок = анти-паттерн. Так появляется flow control через исключения, который делает код непредсказуемым и запутанным.
Как правильно:
- Ошибки представляем явно в коде (например, через
Result, Option, Either паттерны). - Исключения оставляем для действительно неожиданных и фатальных ситуаций.
Бонус: Явные ошибки делают намерения кода прозрачными и облегчают поддержку.
📖 Подробнее: https://milanjovanovic.tech/blog/functional-error-handling-in-dotnet-with-the-result-pattern
#dotnet #cleanCode #architecture
⚙️ 3 способа определить Middleware в ASP.NET Core
Middleware - это компоненты, которые добавляют дополнительную логику до или после обработки HTTP-запроса.
С их помощью можно реализовать аутентификацию, логирование, кеширование, обработку ошибок и другие сквозные функции приложения.
🔧 В ASP.NET Core уже встроено множество middleware (Static Files, Routing, Authentication и др.),
но вы можете создавать и свои собственные.
Вот три основных способа это сделать:
- Request Delegates - определяете логику прямо в
- Convention-based - создаёте класс с методом
- Factory-based - используете фабрику с внедрением зависимостей (DI)
🧠 Подробный разбор и примеры кода - в статье
#dotnet #aspnetcore #backend #middleware #csharp
Middleware - это компоненты, которые добавляют дополнительную логику до или после обработки HTTP-запроса.
С их помощью можно реализовать аутентификацию, логирование, кеширование, обработку ошибок и другие сквозные функции приложения.
🔧 В ASP.NET Core уже встроено множество middleware (Static Files, Routing, Authentication и др.),
но вы можете создавать и свои собственные.
Вот три основных способа это сделать:
- Request Delegates - определяете логику прямо в
app.Use(...) - Convention-based - создаёте класс с методом
Invoke или InvokeAsync - Factory-based - используете фабрику с внедрением зависимостей (DI)
🧠 Подробный разбор и примеры кода - в статье
#dotnet #aspnetcore #backend #middleware #csharp
🔥 EF Core 10 принес нормальные JOIN'ы в LINQ
Больше не нужно вспоминать, как извращаться с GroupJoin + DefaultIfEmpty, чтобы сделать обычный LEFT JOIN.
Теперь есть прямые методы:
✅ LeftJoin
✅ RightJoin
И они делают ровно то, что ты пишешь:
«Оставь все из левой таблицы и подтяни правые записи, если есть совпадения».
Плюсы
- Читаемость выше
- Код короче и очевиднее
- Транслируется в тот же SQL, что и раньше, но без боли
Примерно так LINQ наконец становится ближе к привычному SQL-пониманию разработчика: пишешь join — получаешь join, без магии и обходных путей.
Подробнее про LeftJoin и RightJoin в EF Core 10
#dotnet #efcore #csharp #linq #backend #devtools
Больше не нужно вспоминать, как извращаться с GroupJoin + DefaultIfEmpty, чтобы сделать обычный LEFT JOIN.
Теперь есть прямые методы:
✅ LeftJoin
✅ RightJoin
И они делают ровно то, что ты пишешь:
«Оставь все из левой таблицы и подтяни правые записи, если есть совпадения».
Плюсы
- Читаемость выше
- Код короче и очевиднее
- Транслируется в тот же SQL, что и раньше, но без боли
Примерно так LINQ наконец становится ближе к привычному SQL-пониманию разработчика: пишешь join — получаешь join, без магии и обходных путей.
Подробнее про LeftJoin и RightJoin в EF Core 10
#dotnet #efcore #csharp #linq #backend #devtools
🧠 EF Core и Repository: когда паттерн мешает, а не помогает
👶 Junior: использует EF Core прямо в контроллере
🧑 Middle: строит BaseRepository, IUnitOfWork, IOrderRepository, IOrderDataAccess...
🧓 Senior: снова использует EF Core — без репозиториев
Почему так?
Сначала Repository Pattern кажется удобным:
4 метода на CRUD — всё аккуратно.
Но как только домен растёт, появляются проблемы:
- Репозиторий на каждую сущность
- Общая логика между сущностями? Куда её девать?
- Репозитории раздуваются до 10+ методов
- Тестируемость становится фикцией: мокаем абстракцию от абстракции
А что насчёт "мы вдруг сменим базу"?
В 99% случаев — не смените.
EF Core и так абстрагирует SQL.
А при переходе на NoSQL придётся переписывать модели, запросы и подход целиком.
А что с "это улучшает разделение ответственности"?
На деле:
- В сервисах висит куча репозиториев
- Общая логика размыта
- Больше обвязки, больше боли, меньше пользы
✅ DbContext уже реализует Repository и Unit of Work.
И это официально указано в исходниках EF Core.
🔥 17 000+ разработчиков уже ушли от репозиториев к практичному использованию EF Core в:
- N-Layered архитектуре
- Clean Architecture
- Vertical Slice
- Specification Pattern
- Интеграционных тестах с in-memory
📖 Подробнее:
https://antondevtips.com/blog/why-you-dont-need-a-repository-in-ef-core
#dotnet #efcore #architecture #backend #repositorypattern
👶 Junior: использует EF Core прямо в контроллере
🧑 Middle: строит BaseRepository, IUnitOfWork, IOrderRepository, IOrderDataAccess...
🧓 Senior: снова использует EF Core — без репозиториев
Почему так?
Сначала Repository Pattern кажется удобным:
4 метода на CRUD — всё аккуратно.
Но как только домен растёт, появляются проблемы:
- Репозиторий на каждую сущность
- Общая логика между сущностями? Куда её девать?
- Репозитории раздуваются до 10+ методов
- Тестируемость становится фикцией: мокаем абстракцию от абстракции
А что насчёт "мы вдруг сменим базу"?
В 99% случаев — не смените.
EF Core и так абстрагирует SQL.
А при переходе на NoSQL придётся переписывать модели, запросы и подход целиком.
А что с "это улучшает разделение ответственности"?
На деле:
- В сервисах висит куча репозиториев
- Общая логика размыта
- Больше обвязки, больше боли, меньше пользы
✅ DbContext уже реализует Repository и Unit of Work.
И это официально указано в исходниках EF Core.
🔥 17 000+ разработчиков уже ушли от репозиториев к практичному использованию EF Core в:
- N-Layered архитектуре
- Clean Architecture
- Vertical Slice
- Specification Pattern
- Интеграционных тестах с in-memory
📖 Подробнее:
https://antondevtips.com/blog/why-you-dont-need-a-repository-in-ef-core
#dotnet #efcore #architecture #backend #repositorypattern