This media is not supported in your browser
VIEW IN TELEGRAM
Я никогда не знал об этом! Вы можете открыть VS Code прямо в браузере из репозитория на GitHub.
Просто нажмите клавишу "
Это работает даже если вы не владеете репозиторием!😱
👉 @KodBlog
Просто нажмите клавишу "
." (точка)" в репозитории на GitHub. Это откроет репозиторий в веб-версии VS Code. Можно редактировать и коммитить изменения одним кликом.Это работает даже если вы не владеете репозиторием!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🔥4❤1👏1
Тип
.NET 9 представляет его обобщенный аналог
Он создает словарь, в котором сохраняется порядок пар «ключ-значение».
Ты когда-нибудь использовал🤔
👉 @KodBlog
OrderedDictionary существует в .NET с ранних версий.NET 9 представляет его обобщенный аналог
Он создает словарь, в котором сохраняется порядок пар «ключ-значение».
Ты когда-нибудь использовал
OrderedDictionary? Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍4🔥1
Как управлять задержкой в методе
Начиная с .NET 8, вы можете передать объект
Вы можете использовать
👉 @KodBlog
Task.Delay в тестах?Начиная с .NET 8, вы можете передать объект
TimeProvider в метод Task.DelayTimeProvider будет интерпретировать задержку.Вы можете использовать
FakeTimeProvider, чтобы управлять задержкой в тестах.Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤4🔥1
AutoMapper и MediatR переходят на коммерческую модель 😡
То есть, проекты больше не будут полностью open source. Джимми пишет, что делает это, чтобы обеспечить долгосрочную устойчивость своих OSS-проектов. Ну и сразу уточняет: «нет, это не первоапрельская шутка».
Короче, ещё один популярный open source — в платку. Тренд последних лет продолжается.
Вот источник
👉 @KodBlog
То есть, проекты больше не будут полностью open source. Джимми пишет, что делает это, чтобы обеспечить долгосрочную устойчивость своих OSS-проектов. Ну и сразу уточняет: «нет, это не первоапрельская шутка».
Короче, ещё один популярный open source — в платку. Тренд последних лет продолжается.
Вот источник
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯11👍10🥴2❤1👀1
Этот дашборд для отслеживания цен на акции с использованием Cursor + .NET. 🔥
Использовав вайб-кодинг до того, как это стало модным )
Бэкенд получает начальную цену акции с бесплатного API фондового рынка.
Затем есть фоновая задача, которая случайным образом генерирует обновление цены и передает его клиентам с помощью SignalR.
UI — это чистый HTML + JavaScript + Tailwind CSS для стилизации
Потребовалось около ~15 секунд, чтобы добавить поддержку темного режима.😱
Я с нетерпением жду, как будет развиваться Cursor. Это однозначно самый простой способ быстро создать работающее ПО.
Но поддерживаемость — это то, о чем нужно позаботиться.
В целом, код не плохой. Он работает и читаем. Cursor может даже писать комментарии и рефакторить код.
Я получил лучшие результаты, используя Claude Sonnet 3.5.
А ты уже пробовал Cursor?
👉 @KodBlog
Использовав вайб-кодинг до того, как это стало модным )
Бэкенд получает начальную цену акции с бесплатного API фондового рынка.
Затем есть фоновая задача, которая случайным образом генерирует обновление цены и передает его клиентам с помощью SignalR.
UI — это чистый HTML + JavaScript + Tailwind CSS для стилизации
Потребовалось около ~15 секунд, чтобы добавить поддержку темного режима.
Я с нетерпением жду, как будет развиваться Cursor. Это однозначно самый простой способ быстро создать работающее ПО.
Но поддерживаемость — это то, о чем нужно позаботиться.
В целом, код не плохой. Он работает и читаем. Cursor может даже писать комментарии и рефакторить код.
Я получил лучшие результаты, используя Claude Sonnet 3.5.
А ты уже пробовал Cursor?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥2👌1
"EF Core медленный."
Нет. EF Core, вероятно, лучший фреймворк для доступа к базе данных среди всех языков прямо сейчас.
Но он не исправит плохой код или ваши плохие запросы.
Недавно я разбирал один проект, где тестировщики и разработчики жаловались:
"Наш .NET API тормозит в продакшене. Мы думаем, что EF Core — узкое место."
Я взглянул на код. Вот что я нашёл:
Это использовалось внутри пагинированной конечной точки. Без фильтров. Без
И что ещё хуже — я видел это внутри циклов. API загружал 100 000+ записей на каждый запрос.
Конечно, оно было медленным.
EF Core — мощный инструмент, но он не защищает вас от типичных ошибок. А я их вижу постоянно:
⏩ Ранний вызов
⏩ Отсутствие
⏩ Ленивые загрузки в циклах, вызывающие проблему N+1
⏩ Использование
⏩ Отсутствие проекции только нужных столбцов через
⏩ Регистрация DbContext как Singleton (так делать нельзя)
⏩ Отсутствие индексов в базе данных
и тд.
EF Core даёт гибкость, производительность и тесную интеграцию с .NET.
Но он предполагает, что вы знаете, что делаете.
Если ваши запросы EF Core медленные — проблема, скорее всего, в вас.
👉 @KodBlog
Нет. EF Core, вероятно, лучший фреймворк для доступа к базе данных среди всех языков прямо сейчас.
Но он не исправит плохой код или ваши плохие запросы.
Недавно я разбирал один проект, где тестировщики и разработчики жаловались:
"Наш .NET API тормозит в продакшене. Мы думаем, что EF Core — узкое место."
Я взглянул на код. Вот что я нашёл:
var users = await _context.Users.ToListAsync();
Это использовалось внутри пагинированной конечной точки. Без фильтров. Без
Skip(). без Take()И что ещё хуже — я видел это внутри циклов. API загружал 100 000+ записей на каждый запрос.
Конечно, оно было медленным.
EF Core — мощный инструмент, но он не защищает вас от типичных ошибок. А я их вижу постоянно:
ToList(), ломающий композицию запросаAsNoTracking() в сценариях с преобладанием чтенияInclude() повсюду, даже когда в этом нет нуждыSelect()и тд.
EF Core даёт гибкость, производительность и тесную интеграцию с .NET.
Но он предполагает, что вы знаете, что делаете.
Если ваши запросы EF Core медленные — проблема, скорее всего, в вас.
Please open Telegram to view this post
VIEW IN TELEGRAM
💯37🔥10❤8👍3🥴1
Иногда записи архитектурных решений просто огонь 😗
👉 @KodBlog
Примечание: AccountState находится в отношении 1:1 с SubnoscriptionState, поэтому оба используют один и тот же SubnoscriptionId в качестве первичного идентификатора.
Слушай, мы могли бы сделать их разными ради "чистого кода" или DDD-мусора, но эти две сущности связаны между собой, и Account будет генерировать события для Subnoscription — так эта штука работает в реальной жизни.
Так что, вместо того чтобы делать всё запутанным или добавлять лишние шаги только потому, что какой-то блогер сказал нам так делать, мы сделали эту связь очевидной и простой для понимания, особенно если ты уже знаешь, с каким SubnoscriptionId работаешь.
Please open Telegram to view this post
VIEW IN TELEGRAM
😁10👍4🔥3💯1
Устали листать запутанный и огромный файл Program.cs?
Вот как сделать его чище и читабельнее
Одно из первых, что мы делаем при создании приложения — это настройка:
⏩ Логирования
⏩ Базы данных и ORM
⏩ CORS
⏩ Аутентификации
⏩ DI-сервисов
⏩ Привязок для API
И всё это сваливается в Program.cs — и быстро превращается в кашу.
Вот тут и приходит на помощь паттерн расширения
Он помогает организовать конфигурации сервисов в модульные, читабельные и тестируемые куски.
Больше никаких гигантских цепочек методов или запутанных блоков кода настройки.
Читай целый выпуск на эту тему с примерами
👉 @KodBlog
Вот как сделать его чище и читабельнее
Одно из первых, что мы делаем при создании приложения — это настройка:
И всё это сваливается в Program.cs — и быстро превращается в кашу.
Вот тут и приходит на помощь паттерн расширения
ServiceCollectionОн помогает организовать конфигурации сервисов в модульные, читабельные и тестируемые куски.
Больше никаких гигантских цепочек методов или запутанных блоков кода настройки.
Читай целый выпуск на эту тему с примерами
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤4🔥4
Минимальный пример приложения с поддержкой валидации в Minimal API — тык
Поддержка валидации в Minimal API будет добавлена в dotnet preview 3, который должен выйти совсем скоро
Пример показывает, как использовать атрибуты валидации, такие как
👉 @KodBlog
Поддержка валидации в Minimal API будет добавлена в dotnet preview 3, который должен выйти совсем скоро
Пример показывает, как использовать атрибуты валидации, такие как
Required, Range и StringLength, для проверки входных данных в минимальных API. Для запуска приложения перейдите в каталог api и выполните команду dotnet runPlease open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - captainsafia/minapi-validation-support: This repo demonstrates support for System.ComponentModel.DataAnnotations-based…
This repo demonstrates support for System.ComponentModel.DataAnnotations-based validations in minimal APIs 🏁 - captainsafia/minapi-validation-support
❤4👍2🥴2🔥1
При разработке можно включить
EnableSensitiveDataLogging(), чтобы видеть реальные значения параметров в SQL-запросах — это помогает понять, что именно уходит в базуНикогда не включай это в staging или production!
Функция логирует чувствительные данные (например, пароли, email, токены и т.д.), что может привести к утечке
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤5🔥2
В C# скоро появятся Dictionary Expressions?
Это как продолжение фичи
Как тебе идея?🤔
👉 @KodBlog
Это как продолжение фичи
Collection Expressions из C# 12 — только теперь для словарей. Но пока что на стадии предложенияКак тебе идея?
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10🤔10👍5👀3
Как проверить, что список не
Существует несколько способов это сделать:
1. Классический способ
2. Способ с
3. Способ с
4. Способ с
Какой из них ты предпочитаешь — или используешь другой подход?🤔
👉 @KodBlog
null и содержит элементы?Существует несколько способов это сделать:
1. Классический способ
2. Способ с
List.Count3. Способ с
Enumerable.Any4. Способ с
pattern matchingКакой из них ты предпочитаешь — или используешь другой подход?
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍6❤2
Наткнулся тут на интересный проект — ReactiveGenerator
Это такой современный C# source generator, который автоматизирует реализацию уведомлений об изменении свойств, поддерживая как стандартный
Нам, разработчикам, это даёт главное — чистый код без тонны однотипной ручной писанины.
Например, раньше приходилось вручную писать геттеры и сеттеры с вызовами
Теперь же достаточно использовать атрибуты
👉 @KodBlog
Это такой современный C# source generator, который автоматизирует реализацию уведомлений об изменении свойств, поддерживая как стандартный
INotifyPropertyChanged, так и паттерны ReactiveUI Нам, разработчикам, это даёт главное — чистый код без тонны однотипной ручной писанины.
Например, раньше приходилось вручную писать геттеры и сеттеры с вызовами
RaiseAndSetIfChangedТеперь же достаточно использовать атрибуты
[Reactive] и [ObservableAsProperty]Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍3🔥1
Микросервисы
В правильном контексте они решают реальные проблемы
Мы создавали продукт, в котором разные команды владели разными бизнес-областями — платежи, биллинг, уведомления, отчётность.
Каждой команде нужно было быстро деплоиться, принимать решения независимо и масштабироваться в зависимости от нагрузки
Микросервисы сделали это возможным.
1. У платежей была высокая нагрузка → мы масштабировали только этот сервис
2. Отчётность требовала тяжёлой обработки → мы использовали другой стек
3. Уведомления? Деплоились по нескольку раз в день без влияния на остальное
Это прекрасно работало.
Почему? Потому что проблема была достаточно серьёзной, чтобы оправдать сложность.
Но вот главное:
Микросервисы — не отправная точка
Если вы строите небольшую или среднюю систему с одной командой, чистый монолит с модульными границами будет быстрее, дешевле и проще в управлении
Начните с простоты. Переходите к микросервисам, когда (и только когда) проблема станет реальной
👉 @KodBlog
В правильном контексте они решают реальные проблемы
Мы создавали продукт, в котором разные команды владели разными бизнес-областями — платежи, биллинг, уведомления, отчётность.
Каждой команде нужно было быстро деплоиться, принимать решения независимо и масштабироваться в зависимости от нагрузки
Микросервисы сделали это возможным.
1. У платежей была высокая нагрузка → мы масштабировали только этот сервис
2. Отчётность требовала тяжёлой обработки → мы использовали другой стек
3. Уведомления? Деплоились по нескольку раз в день без влияния на остальное
Это прекрасно работало.
Почему? Потому что проблема была достаточно серьёзной, чтобы оправдать сложность.
Но вот главное:
Микросервисы — не отправная точка
Если вы строите небольшую или среднюю систему с одной командой, чистый монолит с модульными границами будет быстрее, дешевле и проще в управлении
Начните с простоты. Переходите к микросервисам, когда (и только когда) проблема станет реальной
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14💯5🔥1
У нас был один класс под названием
Он занимался всем:
Регистрацией пользователей. Проверкой паролей. Отправкой приветственных писем. Логированием событий. Обновлением информации профиля. Даже вызовами сторонних API
Он работал. Пока не перестал😵💫
Любое изменение становилось рискованным. Небольшое изменение в одном методе ломало другой. Юнит-тесты были в хаосе.
Никто не хотел к нему прикасаться
Вот тогда я по-настоящему понял принцип единственной ответственности (SRP):
🔜 Класс должен иметь только одну причину для изменения
Не потому что так красиво звучит. А потому что это делает код тестируемым, поддерживаемым и читаемым
Мы разбили
⏩ UserRegistrationService
⏩ EmailNotifier
⏩ PasswordValidator
⏩ AuditLogger
Вдруг всё стало понятно. Тесты стали точечными. Вносить изменения стало проще
SRP — это не просто правило. Это способ сохранить ваш код живым надолго
👉 @KodBlog
UserManagerОн занимался всем:
Регистрацией пользователей. Проверкой паролей. Отправкой приветственных писем. Логированием событий. Обновлением информации профиля. Даже вызовами сторонних API
Он работал. Пока не перестал
Любое изменение становилось рискованным. Небольшое изменение в одном методе ломало другой. Юнит-тесты были в хаосе.
Никто не хотел к нему прикасаться
Вот тогда я по-настоящему понял принцип единственной ответственности (SRP):
Не потому что так красиво звучит. А потому что это делает код тестируемым, поддерживаемым и читаемым
Мы разбили
UserManager на более мелкие, сфокусированные сервисы:Вдруг всё стало понятно. Тесты стали точечными. Вносить изменения стало проще
SRP — это не просто правило. Это способ сохранить ваш код живым надолго
Please open Telegram to view this post
VIEW IN TELEGRAM
❤29👍7🔥2🤯1🥴1
GUID, основанное на метке времени и случайностиТеперь GUID стал последовательным, что делает его более подходящим для реляционных баз данных
Также добавлено свойство
Version, позволяющее определить версию созданного GUIDPlease open Telegram to view this post
VIEW IN TELEGRAM
❤19🔥7👍3
5 причин, почему простые extension-методы в C# чаще всего лучше AutoMapper 👇
1. Простота
Пишешь только то, что нужно и ничего лишнего. Extension-методы дают точное управление маппингом без лишней конфигурации
2. Производительность
Без рефлексии и скрытых накладных расходов. Прямой маппинг работает быстрее и экономит ценные миллисекунды на рантайме
3. Читаемость
Код должен рассказывать историю. Когда другой разработчик читает маппинг, extension-метод чаще всего более прозрачен
4. Гибкость
Это твой код. Можно легко адаптировать логику под конкретные кейсы, не упираясь в ограничения сторонней библиотеки.
5. Отладка
Можно спокойно зайти в свой маппинг-код и сразу увидеть, что и как работает. Без необходимости лезть в внутренности AutoMapper
Простота, производительность и контроль — часто выигрывают, особенно когда пишешь чистую и поддерживаемую архитектуру
👉 @KodBlog
1. Простота
Пишешь только то, что нужно и ничего лишнего. Extension-методы дают точное управление маппингом без лишней конфигурации
2. Производительность
Без рефлексии и скрытых накладных расходов. Прямой маппинг работает быстрее и экономит ценные миллисекунды на рантайме
3. Читаемость
Код должен рассказывать историю. Когда другой разработчик читает маппинг, extension-метод чаще всего более прозрачен
4. Гибкость
Это твой код. Можно легко адаптировать логику под конкретные кейсы, не упираясь в ограничения сторонней библиотеки.
5. Отладка
Можно спокойно зайти в свой маппинг-код и сразу увидеть, что и как работает. Без необходимости лезть в внутренности AutoMapper
Простота, производительность и контроль — часто выигрывают, особенно когда пишешь чистую и поддерживаемую архитектуру
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14💯9❤3🔥3
Используй метод
string.Join, чтобы объединить элементы коллекции в одну строку, вставляя указанный разделитель между элементами.А ты используешь
string.Join в своём коде?Please open Telegram to view this post
VIEW IN TELEGRAM
👍23😁7❤5👏3🔥2
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
ASP.NET Core Roadmap for .NET 10 · Issue #59443 · dotnet/aspnetcore
This issue represents the list of major investments our team will focus on during the .NET 10 timeframe. It doesn't include all the features and bug fixes we'll be tackling during this time...
🔥4❤3🤨2🤯1