Как создать HttpClient в .NET?
Рекомендуемый способ — использование
Вы можете использовать
Недостаток в том, что вам придется настраивать HttpClient каждый раз.
Если вам нужен заранее настроенный HttpClient, вы можете использовать именованные или типизированные клиенты.
Вот правильный способ работы с HttpClient в .NET: тык
👉 @KodBlog
Рекомендуемый способ — использование
IHttpClientFactoryВы можете использовать
IHttpClientFactory напрямую.Недостаток в том, что вам придется настраивать HttpClient каждый раз.
Если вам нужен заранее настроенный HttpClient, вы можете использовать именованные или типизированные клиенты.
Вот правильный способ работы с HttpClient в .NET: тык
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥4💯3❤2
Есть такой инструмент — SharpRedirect
С ним можно легко перехватывать и перенаправлять сетевой трафик
Он принимает входящие TCP-подключения на локальный порт и пересылает их на указанный удалённый хост и порт.
😍 Поддерживает двустороннюю передачу данных в полном дуплексе, обеспечивая стабильную и асинхронную работу для повышения производительности.
👉 @KodBlog
С ним можно легко перехватывать и перенаправлять сетевой трафик
Он принимает входящие TCP-подключения на локальный порт и пересылает их на указанный удалённый хост и порт.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍4⚡1
3 различных архитектурных подхода к организации компонентов в приложении
1. Классическая трёхслойная архитектура
Включает три уровня:
🟡 MyApp.Web (контроллеры, взаимодействие с пользователем)
🟡 MyApp.Business (бизнес-логика)
🟡 MyApp.Data (доступ к данным)
Классическая, но может приводить к сильной связанности.
2. CQRS-подход
🟡 Использует паттерн Command Query Responsibility Segregation (CQRS)
🟡
🟡
Улучшает разделение команд и запросов, подходит для сложных систем.
3. Компонентный подход
🟡 Компоненты объединены в единый модуль MyApp.Policies.
🟡
Даёт больше гибкости, но требует продуманной структуры
Как вы упаковываете свои компоненты?🤔
👉 @KodBlog
1. Классическая трёхслойная архитектура
Включает три уровня:
PoliciesController использует IPolicyService, который, в свою очередь, использует IPolicyRepository для работы с базой данных.Классическая, но может приводить к сильной связанности.
2. CQRS-подход
PoliciesController вызывает RenewPolicyCommand, который обрабатывается RenewPolicyHandlerRenewPolicyHandler взаимодействует с IPolicyRepository, который работает с PolicyRepositoryУлучшает разделение команд и запросов, подходит для сложных систем.
3. Компонентный подход
PoliciesController использует IPolicyComponent, который включает в себя PolicyComponent, PolicyService и PolicyRepositoryДаёт больше гибкости, но требует продуманной структуры
Как вы упаковываете свои компоненты?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥2🌚2
Это правильный способ реализации посева данных в ваших .NET-приложениях
EF Core 9 значительно упростил этот процесс.
Больше не нужно переопределять
EF 9 представил методы
👉 @KodBlog
EF Core 9 значительно упростил этот процесс.
Больше не нужно переопределять
OnModelCreating или вручную управлять скриптами заполнения данных.EF 9 представил методы
UseSeeding и UseAsyncSeeding, которые предоставляют удобный способ заполнения базы данных начальными данными.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14👍6🌚1💯1
Media is too big
VIEW IN TELEGRAM
Claude 3.7 Sonnet получил серьёзного конкурента
Gemini 2.5 Pro — действительно хорошая модель для кода👍
⏩ качество кода действительно высокое
⏩ контекст 1M токенов
⏩ нативная мультимодальность
⏩ генерация длинного кода
⏩ понимание крупных кодовых баз
Чувак на видео использовал его вместе с Windsurf для создания приложения поискового агента с ИИ
👉 @KodBlog
Gemini 2.5 Pro — действительно хорошая модель для кода
Чувак на видео использовал его вместе с Windsurf для создания приложения поискового агента с ИИ
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7❤6👍2🥴2
Вы устали писать один и тот же шаблон конструктора в каждом сервисе?
Объявить поле → Внедрить зависимость → Присвоить → Повторить🔁
Здесь на помощь приходят первичные конструкторы в C# 12 — и они значительно упрощают код.
Я использовал их в статических сервисах и вот что заметил:
Плюсы:
☑ Меньше шаблонного кода, больше ясности
☑ Нет лишних полей и присваиваний
☑ Отлично подходят для Minimal API и DI
☑ Держат небольшие сервисы лаконичными и читаемыми
Минусы:
❌ Невозможность объявлять private readonly поля
Вы уже пробовали первичные конструкторы в реальных проектах?
👉 @KodBlog
Объявить поле → Внедрить зависимость → Присвоить → Повторить
Здесь на помощь приходят первичные конструкторы в C# 12 — и они значительно упрощают код.
Я использовал их в статических сервисах и вот что заметил:
Плюсы:
Минусы:
Вы уже пробовали первичные конструкторы в реальных проектах?
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11👍8🐳3💯1
Ах да, этот бесценный "специалист по методам расширения" — что бы мы без тебя делали) 😄
(их сотни в этом проекте)
👉 @KodBlog
(их сотни в этом проекте)
Please open Telegram to view this post
VIEW IN TELEGRAM
😁17🌚5🔥2🐳1
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