dotnet разработчики, те, кто не использует инструменты для маппинга — как вы вручную мапите объект на объект?
И почему выбрали именно такой подход?🤔
Я собрал несколько популярных вариантов, начиная с :
> Пример маппинга через extension-методы
> Пример маппинга через конструктор
> Пример маппинга через статический метод:
> Пример маппинга через явный оператор
> Пример маппинга через неявный оператор
👉 @KodBlog
И почему выбрали именно такой подход?
Я собрал несколько популярных вариантов, начиная с :
> Пример маппинга через extension-методы
> Пример маппинга через конструктор
> Пример маппинга через статический метод:
> Пример маппинга через явный оператор
> Пример маппинга через неявный оператор
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤2
Задана задача импортировать JSON-данные, структура которых не соответствует модели. На 1 фото показан один из способов импорта, при котором одно свойство игнорируется, а два столбца переименовываются.
Результаты
> Новая структура JSON
> Она соответствует нашей модели
На втором фото пример кода с использованием библиотеки
Ставь лайк, если пост оказался полезным💯
👉 @KodBlog
Результаты
> Новая структура JSON
> Она соответствует нашей модели
На втором фото пример кода с использованием библиотеки
FluentValidation
для применения отдельных правил валидатора или всех правил — это может быть полезно для разных требований, а также при тестированииСтавь лайк, если пост оказался полезным
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍2🤔2
Думаешь, хорошо разбираешься в
Этот пост поменяет твой взгляд на перехват HTTP-запросов
Middleware в
Есть три подхода: на делегатах (inline), по соглашению (класс), и через
1️⃣ Сначала можно использовать метод
Такое middleware на основе делегата выполняется до и после следующего компонента в конвейере.
2️⃣ Если логика растёт — вынеси её в отдельный класс middleware по соглашению.
Класс должен иметь конструктор с
3️⃣ Либо реализуй интерфейс
Зарегистрируй класс
Но есть важные нюансы:
> Middleware по умолчанию живёт как singleton, поэтому внедряй только singleton-зависимости.
> Если нужны scoped-сервисы — передавай их через параметры InvokeAsync в middleware по соглашению.
Кастомные middleware используют для:
• логирования
• авторизации
• валидации
• модификации ответов
Какой подход к middleware ты используешь и почему? Напиши в комментах😎
👉 @KodBlog
ASP.NET Core middleware
?Этот пост поменяет твой взгляд на перехват HTTP-запросов
Middleware в
ASP.NET Core
— это компонент, участвующий в конвейере обработки HTTP-запросов и ответов.Есть три подхода: на делегатах (inline), по соглашению (класс), и через
IMiddleware
для кастомной логики.Use
напрямую в конфигурации WebApplication
.Такое middleware на основе делегата выполняется до и после следующего компонента в конвейере.
Класс должен иметь конструктор с
RequestDelegate
и метод InvokeAsync
.IMiddleware
— это более безопасный, проверяемый компилятором способ.Зарегистрируй класс
IMiddleware
в DI-контейнере, и фреймворк сам будет его разрешать.Но есть важные нюансы:
> Middleware по умолчанию живёт как singleton, поэтому внедряй только singleton-зависимости.
> Если нужны scoped-сервисы — передавай их через параметры InvokeAsync в middleware по соглашению.
Кастомные middleware используют для:
• логирования
• авторизации
• валидации
• модификации ответов
Какой подход к middleware ты используешь и почему? Напиши в комментах
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10👍3🔥3
C# Portal | Программирование
Срочные новости в .NET 10 Preview 4 Теперь можно запускать C#-файлы без создания проекта Команда .NET представила отличное нововведение — file-based apps. Теперь можно напрямую запускать один .cs-файл командой: dotnet run Program.cs ✅ Без .csproj ✅ Без…
Скриптинг на C# это круто 😎
Отлично подходит для простых POC и наполнения тестовыми данными, как в этом примере
👉 @KodBlog
Отлично подходит для простых POC и наполнения тестовыми данными, как в этом примере
Please open Telegram to view this post
VIEW IN TELEGRAM
❤21
Как выполнить на 100% безопасную проверку с отрицанием условия?
Это проще, чем кажется.
Но в чём проблема со "старым" способом?
Оператор
А это может привести к нежелательному поведению.
Зато с использованием отрицательного сопоставления с образцом (negated pattern matching) вы в безопасности.
Отрицательные шаблоны — это одна из новых возможностей, добавленных в C# за последние версии.
Они позволяют исключать определённые шаблоны с помощью ключевого слова
Иными словами, можно исключать конкретные структуры из сопоставления.
С этим ваш код становится:
> Проще для понимания
> Читаемее
Но учтите:
Значение, к которому применяется выражение сопоставления, должно быть константным.
👉 @KodBlog
Это проще, чем кажется.
Но в чём проблема со "старым" способом?
Оператор
!=
может быть переопределён.А это может привести к нежелательному поведению.
Зато с использованием отрицательного сопоставления с образцом (negated pattern matching) вы в безопасности.
Отрицательные шаблоны — это одна из новых возможностей, добавленных в C# за последние версии.
Они позволяют исключать определённые шаблоны с помощью ключевого слова
not
Иными словами, можно исключать конкретные структуры из сопоставления.
С этим ваш код становится:
> Проще для понимания
> Читаемее
Но учтите:
Значение, к которому применяется выражение сопоставления, должно быть константным.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤2🤣1
Понимание архитектуры микросервисов
Задумывались ли вы, как компании вроде Netflix и Amazon внедряют новые функции с молниеносной скоростью? Секрет может крыться в их технологическом стеке, основанном на микросервисной архитектуре.
В основе микросервисной архитектуры лежит идея разделения приложения на набор небольших, слабо связанных сервисов. Каждый сервис запускается как отдельный процесс, имеет чётко определённый API, располагается в своей кодовой базе, управляется отдельной командой и развёртывается независимо.
Ключевые компоненты микросервисной архитектуры:
1. Load Balancer (балансировщик нагрузки): равномерно распределяет входящий сетевой трафик между серверами.
2. CDN (Content Delivery Network): распределённая сеть серверов, доставляющая контент пользователю на основе его геолокации — ускоряет загрузку страниц.
3. API Gateway: маршрутизирует входящие запросы к нужному микросервису через REST API или другие протоколы.
4. Management (управление): отвечает за мониторинг и координацию микросервисов, обеспечивая их стабильную работу и взаимодействие.
5. Microservices (микросервисы): каждый сервис реализует отдельную функцию, может взаимодействовать с другими через RPC (удалённый вызов процедур) и сам отвечает за хранение данных или состояния.
Преимущества:
✅ Масштабируемость: можно масштабировать только нужные части приложения
✅ Гибкость: каждый микросервис разрабатывается, развёртывается и масштабируется независимо
✅ Устойчивость: сбой одного сервиса не выводит из строя всё приложение
✅ Быстрая доставка: небольшие кодовые базы — более быстрый выпуск новых функций
Недостатки:
❌ Сложность: больше сервисов — выше архитектурная сложность
❌ Согласованность данных: сложно поддерживать целостность данных между сервисами
❌ Сетевые задержки: взаимодействие между сервисами увеличивает время отклика
❌ Обработка ошибок: сложно отследить, где именно произошла ошибка
Микросервисная архитектура — не панацея, но мощный инструмент в арсенале современной разработки.
👉 @KodBlog
Задумывались ли вы, как компании вроде Netflix и Amazon внедряют новые функции с молниеносной скоростью? Секрет может крыться в их технологическом стеке, основанном на микросервисной архитектуре.
В основе микросервисной архитектуры лежит идея разделения приложения на набор небольших, слабо связанных сервисов. Каждый сервис запускается как отдельный процесс, имеет чётко определённый API, располагается в своей кодовой базе, управляется отдельной командой и развёртывается независимо.
Ключевые компоненты микросервисной архитектуры:
1. Load Balancer (балансировщик нагрузки): равномерно распределяет входящий сетевой трафик между серверами.
2. CDN (Content Delivery Network): распределённая сеть серверов, доставляющая контент пользователю на основе его геолокации — ускоряет загрузку страниц.
3. API Gateway: маршрутизирует входящие запросы к нужному микросервису через REST API или другие протоколы.
4. Management (управление): отвечает за мониторинг и координацию микросервисов, обеспечивая их стабильную работу и взаимодействие.
5. Microservices (микросервисы): каждый сервис реализует отдельную функцию, может взаимодействовать с другими через RPC (удалённый вызов процедур) и сам отвечает за хранение данных или состояния.
Преимущества:
Недостатки:
Микросервисная архитектура — не панацея, но мощный инструмент в арсенале современной разработки.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤2😁1
Ты, скорее всего, пропустил это улучшение в LINQ
Теперь вместо того чтобы использовать Skip и Take для пропуска и выборки определённого количества элементов из коллекции, можно обойтись только Take.
Начиная с .NET 6, у метода Take появилась новая перегрузка, которая поддерживает ещё одну крутую фичу — диапазоны (Ranges).
А что такое диапазоны?
Они появились в C# 8 и позволяют брать подмножество коллекции с помощью оператора .., задавая начальный и конечный индексы.
Начальный индекс включается, конечный — нет. Оба индекса имеют тип Index.
Один из ключевых плюсов такого подхода — улучшенная производительность, так как под капотом процесс выборки данных может быть оптимизирован.
Но учти: если указать индекс, выходящий за пределы коллекции, будет выброшено исключение
👉 @KodBlog
Теперь вместо того чтобы использовать Skip и Take для пропуска и выборки определённого количества элементов из коллекции, можно обойтись только Take.
Начиная с .NET 6, у метода Take появилась новая перегрузка, которая поддерживает ещё одну крутую фичу — диапазоны (Ranges).
А что такое диапазоны?
Они появились в C# 8 и позволяют брать подмножество коллекции с помощью оператора .., задавая начальный и конечный индексы.
Начальный индекс включается, конечный — нет. Оба индекса имеют тип Index.
Один из ключевых плюсов такого подхода — улучшенная производительность, так как под капотом процесс выборки данных может быть оптимизирован.
Но учти: если указать индекс, выходящий за пределы коллекции, будет выброшено исключение
IndexOutOfRangeException
Please open Telegram to view this post
VIEW IN TELEGRAM
❤16🤣3
Visual Studio теперь отображает возвращаемые значения методов прямо в коде
Фича появилась в версии 17.12 (выпущена в ноябре).
Я всегда считал, что временные переменные помогают снизить когнитивную нагрузку при работе с возвратами методов, но, похоже, теперь игра изменилась
👉 @KodBlog
Фича появилась в версии 17.12 (выпущена в ноябре).
Я всегда считал, что временные переменные помогают снизить когнитивную нагрузку при работе с возвратами методов, но, похоже, теперь игра изменилась
Please open Telegram to view this post
VIEW IN TELEGRAM
👍23❤4
Как сделать настройки приложения строго типизированными?
Рекомендуемый способ — использовать паттерн Options.
Он обеспечивает строго типизированный доступ к конфигурации приложения.
В .NET паттерн Options реализован через три интерфейса:
>
>
>
Чтобы создать строго типизированную конфигурацию, можно использовать классы или record-типы.
❗️ Нельзя использовать позиционные record-типы — нужен конструктор без параметров, обязательный для десериализации конфигурации.
Преимущества использования record-типов:
> Иммутабельность
> Читаемость
> Сравнение по значению (value equality)
Вы можете просто зарегистрировать тип в DI-контейнере и использовать его там, где нужно.
Реализация — простая, а преимущества очевидны:
> Строгая типизация конфигурации
> Разделение ответственности
> Централизация и согласованность
Этого достаточно, чтобы начать использовать подход в продакшн-проектах
👉 @KodBlog
Рекомендуемый способ — использовать паттерн Options.
Он обеспечивает строго типизированный доступ к конфигурации приложения.
В .NET паттерн Options реализован через три интерфейса:
>
IOptions<T>
— доступ к строго типизированным параметрам>
IOptionsSnapshot<T>
— доступ к значениям конфигурации на момент запроса>
IOptionsMonitor<T>
— доступ к текущим значениям и возможность подписки на измененияЧтобы создать строго типизированную конфигурацию, можно использовать классы или record-типы.
Преимущества использования record-типов:
> Иммутабельность
> Читаемость
> Сравнение по значению (value equality)
Вы можете просто зарегистрировать тип в DI-контейнере и использовать его там, где нужно.
Реализация — простая, а преимущества очевидны:
> Строгая типизация конфигурации
> Разделение ответственности
> Централизация и согласованность
Этого достаточно, чтобы начать использовать подход в продакшн-проектах
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9❤5👍2👏2
This media is not supported in your browser
VIEW IN TELEGRAM
Самое раздражающее при отладке C#-кода?
(что может серьёзно замедлить процесс)
Проверка значений в коллекции.
Приходится разворачивать каждый элемент, чтобы посмотреть значения свойств.
Чтобы решить эту проблему, в Visual Studio недавно появилась функция закрепляемых свойств (pinnable properties).
Она позволяет быстро отслеживать нужные свойства.
Чтобы воспользоваться, наведите курсор на свойство и нажмите на иконку закрепления.
См. видео-пример, как это использовать🕵️♀️
👉 @KodBlog
(что может серьёзно замедлить процесс)
Приходится разворачивать каждый элемент, чтобы посмотреть значения свойств.
Чтобы решить эту проблему, в Visual Studio недавно появилась функция закрепляемых свойств (pinnable properties).
Она позволяет быстро отслеживать нужные свойства.
Чтобы воспользоваться, наведите курсор на свойство и нажмите на иконку закрепления.
См. видео-пример, как это использовать
Please open Telegram to view this post
VIEW IN TELEGRAM
❤20🔥7👀2😁1
Как сделать систему масштабируемой?
Современные приложения должны справляться с резкими всплесками трафика без сбоев.
Когда один сервер достигает предела, это чревато задержками, ошибками или полной недоступностью.
Есть два основных подхода:
> Вертикальное масштабирование → увеличение ресурсов одного сервера
> Горизонтальное масштабирование → добавление серверов за балансировщиком нагрузки
Для горизонтального масштабирования отличным выбором является YARP — высокопроизводительный обратный прокси от Microsoft для .NET.
В моих тестах с K6 масштабирование до 5 экземпляров API дало прирост:
✅ Время отклика: с 9.68 мс до 4.65 мс
✅ Пропускная способность: с 2260 RPS до 3881 RPS
Настроить YARP и запустить масштабирование можно за считанные минуты.
👉 Подробности: read
👉 @KodBlog
Современные приложения должны справляться с резкими всплесками трафика без сбоев.
Когда один сервер достигает предела, это чревато задержками, ошибками или полной недоступностью.
Есть два основных подхода:
> Вертикальное масштабирование → увеличение ресурсов одного сервера
> Горизонтальное масштабирование → добавление серверов за балансировщиком нагрузки
Для горизонтального масштабирования отличным выбором является YARP — высокопроизводительный обратный прокси от Microsoft для .NET.
В моих тестах с K6 масштабирование до 5 экземпляров API дало прирост:
Настроить YARP и запустить масштабирование можно за считанные минуты.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4
This media is not supported in your browser
VIEW IN TELEGRAM
Событийно-ориентированные фоновые задачи в C#
BackgroundWorker — это легковесный инструмент для выполнения асинхронной работы.
Обмен сообщениями между хостом и рабочим происходит через события.
Есть встроенная поддержка отмены задач и обновлений прогресса.
LINQPad визуализирует весь процесс :
вызвал
Хочешь, стилизуй вывод с помощью CSS.
👉 Полный скрипт для загрузки доступен по ссылке: https://share.linqpad.net/phkul63s.linq
👉 @KodBlog
BackgroundWorker — это легковесный инструмент для выполнения асинхронной работы.
Обмен сообщениями между хостом и рабочим происходит через события.
Есть встроенная поддержка отмены задач и обновлений прогресса.
LINQPad визуализирует весь процесс :
вызвал
Dump()
— и данные сразу в окне Results как HTML.Хочешь, стилизуй вывод с помощью CSS.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍3
#1 ошибка, которую я вижу у .NET-разработчиков — это повсеместное использование null.
Ссылки на null стали причиной множества багов, уязвимостей и сбоев систем.
Вот 4 способа минимизировать использование null в C#:
1. Возвращайте пустое значение из метода
> если возможно, возвращайте пустой список вместо null
> например, используйте
2. Исключайте null с помощью nullable reference types
> представлены в C# 8.0
> заставляют вас явно учитывать возможность null
3. Используйте паттерн Null Object
> объект, реализующий поведение “ничего не делать”
> позволяет избежать проверок на null
4. Используйте оператор null-условия (?.)
> безопасно обращается к свойствам объектов
> если экземпляр равен null, всё выражение вернёт null
Хотите сократить количество сбоев? Попробуйте эти подходы.👀
👉 @KodBlog
Ссылки на null стали причиной множества багов, уязвимостей и сбоев систем.
Вот 4 способа минимизировать использование null в C#:
1. Возвращайте пустое значение из метода
> если возможно, возвращайте пустой список вместо null
> например, используйте
Enumerable.Empty<TResult>()
2. Исключайте null с помощью nullable reference types
> представлены в C# 8.0
> заставляют вас явно учитывать возможность null
3. Используйте паттерн Null Object
> объект, реализующий поведение “ничего не делать”
> позволяет избежать проверок на null
4. Используйте оператор null-условия (?.)
> безопасно обращается к свойствам объектов
> если экземпляр равен null, всё выражение вернёт null
Хотите сократить количество сбоев? Попробуйте эти подходы.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16❤3
Пример использования паттерна IOptions в ASP dotnet
На втором примере эквивалент с использованием
А ты используешь этот паттерн?👀
👉 @KodBlog
IOptions<T>
обеспечивает безопасность на этапе компиляции и устраняет использование магических строк.На втором примере эквивалент с использованием
IConfiguration
вместо IOptions
А ты используешь этот паттерн?
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7🤯3🔥2