This media is not supported in your browser
VIEW IN TELEGRAM
Понимай любую кодовую базу за секунды прямо в VS Code 🤯
Это расширение превращает весь твой проект в наглядную архитектурную визуализацию / показывает, как всё связано, двигается и зависит друг от друга.
Идеально, когда ты подключаешься к новому репозиторию или возвращаешься к старому.
Что делать:
1. Установи расширение Swark
2. Открой Command Palette (Ctrl + Shift + P)
3. Введи “Swark: Create Architecture Diagram” и выбери команду
4. Укажи корневую папку проекта
👉 @KodBlog
Это расширение превращает весь твой проект в наглядную архитектурную визуализацию / показывает, как всё связано, двигается и зависит друг от друга.
Идеально, когда ты подключаешься к новому репозиторию или возвращаешься к старому.
Что делать:
1. Установи расширение Swark
2. Открой Command Palette (Ctrl + Shift + P)
3. Введи “Swark: Create Architecture Diagram” и выбери команду
4. Укажи корневую папку проекта
Please open Telegram to view this post
VIEW IN TELEGRAM
❤14🔥5👎1
.NET 10 уже вышел!
Вот главные обновления по ключевым направлениям:
Нужна стартовая точка под .NET 10? Пора обновляться.
👉 @KodBlog
Вот главные обновления по ключевым направлениям:
C# 14
— расширяемые члены, свойства с полями, implicit spans и обновлённый nameof с поддержкой лямбд. Код стал чище и лаконичнее.
ASP.NET Core
— улучшенная поддержка OpenAPI, встроенная валидация для Minimal API, Server-Sent Events (SSE) и аутентификация с passkey.
EF Core
— добавлен поиск по векторам в SQL, улучшен LINQ–SQL перевод, появились Complex Types и полнотекстовый поиск в Cosmos DB.
Runtime
— прокачанный JIT-компилятор, больше stack allocation, поддержка AVX10.2 и улучшенный NativeAOT — приложения стали легче и быстрее.
Библиотеки
— новые криптографические API, свежие опции для JSON-сериализации, новый WebSocketStream API и ускоренная работа с ZipArchive.
SDK
— апдейты для file-based apps, поддержка контейнеров в консольных приложениях, tab-completion и команда dotnet tool exec.
Aspire
— полноценная поддержка Python и JS, деплой через Aspire Do, контейнеры как артефакты и новый AppHost CLI.
.NET MAUI
— улучшена диагностика и телеметрия верстки, добавлен XAML source generator, обновлён MediaPicker и шаблон Aspire service-defaults.
Нужна стартовая точка под .NET 10? Пора обновляться.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤18👍9👏2🥴1
Похоже, Entity Framework Core с .SqlQuery становится моим новым основным способом доступа к данным.
По моим неофициальным замерам, производительность выше, чем у Dapper, и при этом всё гораздо проще.
Чуть-чуть медленнее, чем чистый
DbContext при этом остаётся максимально лёгким.
👉 @KodBlog
По моим неофициальным замерам, производительность выше, чем у Dapper, и при этом всё гораздо проще.
Чуть-чуть медленнее, чем чистый
ADO.NET, но разница минимальная.DbContext при этом остаётся максимально лёгким.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥20👍9❤7
Extension members в C# 14, пожалуй, лучшее, что Microsoft добавила в язык. Теперь можно писать такой чистый и лаконичный код.
👉 @KodBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
🥴29👍12🔥7🤔3👏1
Новая версия AsyncAwaitBestPractices v10.0.0
✅ Добавлена поддержка .NET 10
Та самая библиотека async/await, которую все любят, теперь собрана и оптимизирована под .NET 10.
👉 @KodBlog
Та самая библиотека async/await, которую все любят, теперь собрана и оптимизирована под .NET 10.
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - TheCodeTraveler/AsyncAwaitBestPractices: Extensions for System.Threading.Tasks.Task and System.Threading.Tasks.ValueTask
Extensions for System.Threading.Tasks.Task and System.Threading.Tasks.ValueTask - TheCodeTraveler/AsyncAwaitBestPractices
🥴7👍5🔥2
Оптимизация запроса в EF Core снизила время выполнения с 30 секунд до 30 миллисекунд.
Вот какие шаги помогли
Исходный запрос был из реального проекта соцсети.
Сущности и связи:
Users — у каждого много постов и комментариев
Comments — привязаны к юзеру и посту
Categories — у постов есть категория
Posts — имеют категорию и множество лайков
Likes — относятся к конкретному посту
Задача:
Выбрать топ 5 пользователей, которые оставили больше всего комментариев за последние 7 дней под постами категории .NET.
Для каждого нужно вернуть:
- UserId
- Username
- количество комментариев (только под .NET постами за последние 7 дней)
- топ 3 .NET поста по лайкам, которые этот пользователь чаще всего комментировал (PostId, LikesCount)
Что было сделано для ускорения:
- Предфильтрация пользователей
- Ограничение до топ-5
- Сокращение числа JOIN
- Проекция только нужных полей
- Формирование результата в одном запросе
- Использование AsSplitQuery
- Трехфазный подход
- Двухфазный подход
Подробности можно посмотреть здесь
👉 @KodBlog
Вот какие шаги помогли
Исходный запрос был из реального проекта соцсети.
Сущности и связи:
Users — у каждого много постов и комментариев
Comments — привязаны к юзеру и посту
Categories — у постов есть категория
Posts — имеют категорию и множество лайков
Likes — относятся к конкретному посту
Задача:
Выбрать топ 5 пользователей, которые оставили больше всего комментариев за последние 7 дней под постами категории .NET.
Для каждого нужно вернуть:
- UserId
- Username
- количество комментариев (только под .NET постами за последние 7 дней)
- топ 3 .NET поста по лайкам, которые этот пользователь чаще всего комментировал (PostId, LikesCount)
Что было сделано для ускорения:
- Предфильтрация пользователей
- Ограничение до топ-5
- Сокращение числа JOIN
- Проекция только нужных полей
- Формирование результата в одном запросе
- Использование AsSplitQuery
- Трехфазный подход
- Двухфазный подход
Подробности можно посмотреть здесь
Please open Telegram to view this post
VIEW IN TELEGRAM
🥴10❤6👍2😁1
Media is too big
VIEW IN TELEGRAM
WinForms приложения на .NET Framework можно переехать в web на .NET 9+ и задеплоить в Azure App Services через Visual Studio и copilot за пару минут.
Вся логика приложения и бизнес-код сохраняются.
Сочетание Visual Studio 2026 и GitHub Copilot творит вещи.
👉 @KodBlog
Вся логика приложения и бизнес-код сохраняются.
Сочетание Visual Studio 2026 и GitHub Copilot творит вещи.
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯20👍5🥴4🤔3😁1
Ты уже смотрел на новый IExceptionHandler?
Исключения как-то обрабатывать все равно нужно.
IExceptionHandler реализует паттерн с префиксом Try-.
Ты сам решаешь, какие исключения обрабатывать.
Чтобы сообщить middleware, что ты обработал исключение, нужно вернуть true.
Так что же делает это таким интересным?
Можно выстраивать несколько обработчиков исключений в цепочку, и они будут вызываться по очереди.
Первый, который успешно обработает исключение, прерывает цепочку.
Вот как использовать это в .NET 10: читать
👉 @KodBlog
Исключения как-то обрабатывать все равно нужно.
IExceptionHandler реализует паттерн с префиксом Try-.
Ты сам решаешь, какие исключения обрабатывать.
Чтобы сообщить middleware, что ты обработал исключение, нужно вернуть true.
Так что же делает это таким интересным?
Можно выстраивать несколько обработчиков исключений в цепочку, и они будут вызываться по очереди.
Первый, который успешно обработает исключение, прерывает цепочку.
Вот как использовать это в .NET 10: читать
Please open Telegram to view this post
VIEW IN TELEGRAM
❤13🔥7👍4👏1
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9🥴5
Вышло новое сравнение популярных подходов для массовой вставки данных в SQL Server. После практических тестов самым быстрым решением оказался SqlBulkCopy. Он требует больше кода и немного ручной настройки, но по скорости уверенно обгоняет альтернативы.
Для PostgreSQL аналогом выступает команда COPY, работающая по схожему принципу и тоже показывающая отличный перфоманс.
Помимо этого протестированы еще пять других методов, включая варианты с EF Core и C#. Полное сравнение доступно по ссылке
👉 @KodBlog
Для PostgreSQL аналогом выступает команда COPY, работающая по схожему принципу и тоже показывающая отличный перфоманс.
Помимо этого протестированы еще пять других методов, включая варианты с EF Core и C#. Полное сравнение доступно по ссылке
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤3👌2👏1😁1
Понимание паттерна Observer это одна из базовых вещей, которую должен знать любой frontend-разработчик.
👉 @KodBlog
// Наблюдатели, которые выполняют Update, когда получают уведомление
interface IObserver
{
void Update(string message);
}
// Субъект, который уведомляет подписанных наблюдателей
interface ISubject
{
// Регистрация, удаление и уведомление наблюдателей
void Register(IObserver observer);
void Unregister(IObserver observer);
void Notify(string message);
}
// Конкретная реализация субъекта, который рассылает обновления подписчикам
class ConcreteSubject : ISubject
{
private readonly List<IObserver> observers = new();
public void Register(IObserver observer)
{
observers.Add(observer);
}
public void Unregister(IObserver observer)
{
observers.Remove(observer);
}
public void Notify(string message)
{
foreach (var observer in observers)
{
observer.Update(message);
}
}
}
// Конкретная реализация наблюдателя, который реагирует на уведомления субъекта
class ConcreteObserver : IObserver
{
private readonly string name;
public ConcreteObserver(string name)
{
this.name = name;
}
public void Update(string message)
{
Console.WriteLine($"{name} получил сообщение: {message}");
}
}
// Создаем субъект и наблюдателей
var subject = new ConcreteSubject();
var observer1 = new ConcreteObserver("Наблюдатель 1");
var observer2 = new ConcreteObserver("Наблюдатель 2");
// Подписываем наблюдателей на субъект
subject.Register(observer1);
subject.Register(observer2);
// Субъект меняет состояние и уведомляет подписчиков
subject.Notify("Состояние изменилось.");
subject.Notify("Доступно новое обновление.");
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10👍5😁4
Это приложение прям отличный вариант для разработчиков. Показывает, какие порты у тебя открыты, и позволяет закрыть любой в один клик.
Опенсорсное и работает на Windows, Linux и macOS.
👉 @KodBlog
Опенсорсное и работает на Windows, Linux и macOS.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤15🔥6👏1😁1🤔1
Производительность платежной системы в проде была увеличена примерно в 15 раз — всего одной строкой кода в EF Core
Система обрабатывает массовые платежи, разбивая один запрос на множество аккаунтов получателей.
В тестах всё работало нормально, но при переходе в прод с реальными объёмами данных API стал тратить секунды на обработку одного запроса по нескольким тысячам счетов.
Каждый платежный запрос делает выборку из таблицы payment_accounts, чтобы определить счета, которые еще не были полностью оплачены.
Тест на 19 000 аккаунтов в SQL Server показал время обработки: 8.22 секунды.
Требование SLA (p99): 1 секунда.
API был примерно в 8 раз медленнее порога SLA.
Основная проблема оказалась в методе SaveChangesAsync.
EF Core умеет группировать несколько вставок, но база данных все равно выполняет их по отдельности.
В SQL Server EF Core использует оператор MERGE для массовых вставок, но подход ограничен лимитом SQL-параметров (2100 на батч). Если у сущностей много полей = производительность быстро падает.
После оптимизаций стало понятно, что штатными инструментами EF Core не удастся добиться нужной скорости.
Решением стала библиотека Entity Framework Extensions.
Она даёт простой, гибкий и быстрый способ для bulk-вставок, позволяя вставлять тысячи записей за один запрос к базе.
Методы BulkInsert и BulkInsertOptimized позволяют выполнить массовую вставку буквально одной строкой кода.
С их помощью время вставки удалось снизить до 521 мс, что укладывается в SLA.
👉 @KodBlog
Система обрабатывает массовые платежи, разбивая один запрос на множество аккаунтов получателей.
В тестах всё работало нормально, но при переходе в прод с реальными объёмами данных API стал тратить секунды на обработку одного запроса по нескольким тысячам счетов.
Каждый платежный запрос делает выборку из таблицы payment_accounts, чтобы определить счета, которые еще не были полностью оплачены.
Тест на 19 000 аккаунтов в SQL Server показал время обработки: 8.22 секунды.
Требование SLA (p99): 1 секунда.
API был примерно в 8 раз медленнее порога SLA.
Основная проблема оказалась в методе SaveChangesAsync.
EF Core умеет группировать несколько вставок, но база данных все равно выполняет их по отдельности.
В SQL Server EF Core использует оператор MERGE для массовых вставок, но подход ограничен лимитом SQL-параметров (2100 на батч). Если у сущностей много полей = производительность быстро падает.
После оптимизаций стало понятно, что штатными инструментами EF Core не удастся добиться нужной скорости.
Решением стала библиотека Entity Framework Extensions.
Она даёт простой, гибкий и быстрый способ для bulk-вставок, позволяя вставлять тысячи записей за один запрос к базе.
Методы BulkInsert и BulkInsertOptimized позволяют выполнить массовую вставку буквально одной строкой кода.
С их помощью время вставки удалось снизить до 521 мс, что укладывается в SLA.
Please open Telegram to view this post
VIEW IN TELEGRAM
👌9👍7❤3🔥1
AsNoTracking() вроде ускоряет выполнение, но есть тонкий момент, о котором часто забывают, а именно о том , что он может создавать дубликаты сущностей в памяти.
Почему так происходит? Потому что без change tracker EF Core не делает identity resolution - он не проверяет, была ли эта сущность уже загружена ранее. В итоге можно получить несколько объектов, которые на самом деле представляют одну и ту же запись в базе.
Пример:
Если у нескольких заказов один и тот же пользователь, то Customer будет склонирован под каждый заказ. То есть:
• больше памяти
• сравнение сущностей по ссылке становится бесполезным
• нарушается связность графа объектов
Решение — AsNoTrackingWithIdentityResolution()
Этот метод даёт баланс:
• нет change tracking (то есть быстрый чтение-only режим)
• есть identity resolution (одна сущность — один объект)
Пример:
Теперь все заказы, у которых один и тот же Customer, будут ссылаться ровно на один объект пользователя.
Как это работает внутри:
• запрос выполняется без отслеживания
• EF Core создаёт временную identity map
• сущности с одинаковым ключом получат одинаковый объект
• карта удаляется после завершения запроса
То есть tracking нет, но дубликатов тоже нет.
Если это поведение нужно часто, его можно включить по умолчанию:
Когда использовать:
1. Отслеживание по умолчанию:
- необходимо обновлять, удалять или отслеживать изменения сущностей;
- небольшие наборы результатов, где затраты на отслеживание незначительны;
- необходимо автоматическое обнаружение изменений.
2. AsNoTracking:
- операции только чтения;
- нет свойств навигации или связанных сущностей;
- максимальная производительность критически важна;
- результаты не содержат дублирующихся сущностей.
3. AsNoTrackingWithIdentityResolution:
- операции только чтения с include/join;
- требуется ссылочная целостность в графе объектов;
- запросы, возвращающие одну сущность несколько раз;
- требуется сравнивать сущности по ссылке.
👉 @KodBlog
Почему так происходит? Потому что без change tracker EF Core не делает identity resolution - он не проверяет, была ли эта сущность уже загружена ранее. В итоге можно получить несколько объектов, которые на самом деле представляют одну и ту же запись в базе.
Пример:
var orders = await context.Orders
.AsNoTracking()
.Include(o => o.Customer)
.Where(o => o.OrderDate > DateTime.Now.AddDays(-30))
.ToListAsync();
Если у нескольких заказов один и тот же пользователь, то Customer будет склонирован под каждый заказ. То есть:
• больше памяти
• сравнение сущностей по ссылке становится бесполезным
• нарушается связность графа объектов
Решение — AsNoTrackingWithIdentityResolution()
Этот метод даёт баланс:
• нет change tracking (то есть быстрый чтение-only режим)
• есть identity resolution (одна сущность — один объект)
Пример:
var orders = await context.Orders
.AsNoTrackingWithIdentityResolution()
.Include(o => o.Customer)
.Where(o => o.OrderDate > DateTime.Now.AddDays(-30))
.ToListAsync();
Теперь все заказы, у которых один и тот же Customer, будут ссылаться ровно на один объект пользователя.
Как это работает внутри:
• запрос выполняется без отслеживания
• EF Core создаёт временную identity map
• сущности с одинаковым ключом получат одинаковый объект
• карта удаляется после завершения запроса
То есть tracking нет, но дубликатов тоже нет.
Если это поведение нужно часто, его можно включить по умолчанию:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder
.UseSqlServer(connectionString)
.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTrackingWithIdentityResolution);
}
Когда использовать:
1. Отслеживание по умолчанию:
- необходимо обновлять, удалять или отслеживать изменения сущностей;
- небольшие наборы результатов, где затраты на отслеживание незначительны;
- необходимо автоматическое обнаружение изменений.
2. AsNoTracking:
- операции только чтения;
- нет свойств навигации или связанных сущностей;
- максимальная производительность критически важна;
- результаты не содержат дублирующихся сущностей.
3. AsNoTrackingWithIdentityResolution:
- операции только чтения с include/join;
- требуется ссылочная целостность в графе объектов;
- запросы, возвращающие одну сущность несколько раз;
- требуется сравнивать сущности по ссылке.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤14👍1
This media is not supported in your browser
VIEW IN TELEGRAM
Visual Studio 2026 официально вышла.
Раньше обновление Visual Studio автоматически тянуло за собой обновление .NET и C++ toolchain. Один пакет значит один риск. Хотел новые фичи IDE? Заодно получай новые компиляторы, нужные они тебе или нет.
В VS 2026 это разделили. IDE обновляется отдельно. Новые фичи прилетают раз в месяц. Build tools остаются в нужной версии.
Производительность подтянули по всем направлениям. Количество UI фризов уменьшилось на 50%. Запуск под F5 стал быстрее на 30% вместе с .NET 10. Большие решения загружаются ощутимо быстрее, а не только формально по цифрам.
Code coverage больше не только в Enterprise.
Теперь он доступен во всех версиях. Разработчики на Community и Professional могут анализировать покрытие тестами без апгрейда лицензии.
Интеграция с AI стала глубже. Copilot теперь понимает внешние символы в C#, а не только твой проект. Он может подтягивать контекст по URL. Debugger агент умеет автоматически чинить упавшие unit-тесты: предполагает причину, правит, проверяет и повторяет цикл, пока тест не пройдет.
Обратная совместимость полная. Проекты из VS 2022 открываются напрямую. Все 4000+ расширений работают без правок. Никакой миграции.
Fluent UI — самое заметное изменение, но далеко не главное. Главное то, что IDE стала быстрее, стабильнее и обновляется без принудительных обновлений compiler toolchain.
Что попробовать в первую очередь:
- Открой свою самую тяжелую solution и почувствуй разницу
- Запусти code coverage в Community/Professional
- Дай debugger агенту починить упавший тест
Уже доступно. Проекты и расширения из VS 2022 переносятся автоматически.
👉 @KodBlog
Раньше обновление Visual Studio автоматически тянуло за собой обновление .NET и C++ toolchain. Один пакет значит один риск. Хотел новые фичи IDE? Заодно получай новые компиляторы, нужные они тебе или нет.
В VS 2026 это разделили. IDE обновляется отдельно. Новые фичи прилетают раз в месяц. Build tools остаются в нужной версии.
Производительность подтянули по всем направлениям. Количество UI фризов уменьшилось на 50%. Запуск под F5 стал быстрее на 30% вместе с .NET 10. Большие решения загружаются ощутимо быстрее, а не только формально по цифрам.
Code coverage больше не только в Enterprise.
Теперь он доступен во всех версиях. Разработчики на Community и Professional могут анализировать покрытие тестами без апгрейда лицензии.
Интеграция с AI стала глубже. Copilot теперь понимает внешние символы в C#, а не только твой проект. Он может подтягивать контекст по URL. Debugger агент умеет автоматически чинить упавшие unit-тесты: предполагает причину, правит, проверяет и повторяет цикл, пока тест не пройдет.
Обратная совместимость полная. Проекты из VS 2022 открываются напрямую. Все 4000+ расширений работают без правок. Никакой миграции.
Fluent UI — самое заметное изменение, но далеко не главное. Главное то, что IDE стала быстрее, стабильнее и обновляется без принудительных обновлений compiler toolchain.
Что попробовать в первую очередь:
- Открой свою самую тяжелую solution и почувствуй разницу
- Запусти code coverage в Community/Professional
- Дай debugger агенту починить упавший тест
Уже доступно. Проекты и расширения из VS 2022 переносятся автоматически.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤24👍3👎2