Библиотека шарписта | C#, F#, .NET, ASP.NET
23.3K subscribers
2.11K photos
32 videos
85 files
4.28K links
Все самое полезное для C#-разработчика в одном канале.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/b60af5a4

Для обратной связи: @proglibrary_feeedback_bot

РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead
Download Telegram
💡Лучшие практики работы с HttpClient в C#

HttpClient — это часто неочевидная область, где мелкие ошибки могут обернуться большими проблемами, такими как утечки ресурсов, игнорирование изменений DNS или перегрузка сети. Вот несколько ключевых уроков, которые помогут вам эффективно управлять HTTP-запросами в ваших приложениях.

1️⃣ Никогда не создавайте HttpClient в цикле
Каждый раз, когда вы создаёте новый экземпляр HttpClient, в операционной системе открывается новый TCP-сокет. Если вы забыли правильно утилизировать его (или создаёте их слишком много за короткий промежуток времени), это может привести к исчерпанию доступных портов и замедлению работы приложения.

2️⃣ Используйте IHttpClientFactory
Вместо создания HttpClient вручную, внедряйте фабрику IHttpClientFactory. Она решает проблемы утечки сокетов, управляет временем жизни клиентов и правильно обрабатывает изменения DNS.

3️⃣ Используйте политику повторных попыток
Сетевые запросы могут иногда прерываться. Настройте стратегию повторных попыток через библиотеку Polly, к примеру.
services.AddHttpClient("RetryClient")
.AddTransientHttpErrorPolicy(policy =>
policy.WaitAndRetryAsync(3, _ => TimeSpan.FromSeconds(2)));


📎Если вы хотите погрузиться глубже, разобраться с именованными и типизированными клиентами, управлением DNS и правильной утилизацией, то рекомендуем статью к прочтению

🐸Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM
🤨 Неочевидная проблема FirstOrDefault

Метод FirstOrDefault в LINQ может стать источником путаницы. Он возвращает первый элемент последовательности или значение по умолчанию для типа, если элементов нет. Для ссылочных типов и Nullable<T> это null, а для значимых типов (например, int) — это их дефолтное значение (0, false и т.д.).

✏️ Например, вызов FirstOrDefault для пустого списка List<int> вернёт 0, что может быть неожиданно, если 0 имеет смысловое значение в вашем коде.
var numbers = new List<int> { };
var result = numbers.FirstOrDefault();
Console.WriteLine(result); // Вывод: 0


❗️Чтобы избежать ошибок, рекомендуется явно проверять коллекцию на пустоту перед вызовом метода или использовать DefaultIfEmpty, чтобы задать своё значение по умолчанию. Например:
var result = numbers.DefaultIfEmpty(null).FirstOrDefault();


Это гарантирует, что даже для пустой коллекции результат будет null, а не дефолтное значение типа. Такой подход делает код понятным и избавляет от скрытых проблем с обработкой "пустых" результатов.

🐸Библиотека шарписта

#tip
Please open Telegram to view this post
VIEW IN TELEGRAM
🔢 Числовая сортировка строк в .NET

Спустя 10 лет дискуссий сообщество .NET наконец-то получит поддержку числовой сортировки строк. Теперь строки с числами, например "file2" и "file10", сортируются логично с учётом чисел. Это стало возможным благодаря новому флагу CompareOptions.NumericOrdering, добавленному в PR#109861. Вопрос впервые подняли ещё в 2015 году в issue#13979, и с тех пор разработчики искали безопасный и универсальный способ его решения.

🎉Эта долгожданная функция будет доступна в будущих версиях .NET, улучшая работу со строками в файлах, версиях и других данных.

#новость

🐸Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡️ Работа с gRPC API в .NET 8

Что такое gRPC?
gRPC — это фреймворк удаленных вызовов процедур, который использует HTTP/2 для передачи данных между приложениями. Он выделяется высокой производительностью благодаря бинарному формату Protocol Buffers.

🧑‍💻Реализация API
В статье из C#Corner пошагово описан процесс реализации API в .NET 8:

1️⃣ Всё начинается с создания нового проекта с использованием шаблона "gRPC Service".

2️⃣ Затем внимание уделяется определению Proto-файла, который задает структуру запросов и ответов, а также созданию методов API.

3️⃣ Далее рассматривается, как написать серверную логику, обрабатывающую CRUD-операции, и настроить маршруты для работы API.

4️⃣ Заключительный этап — тестирование с использованием Postman, который позволит отправить gRPC-запросы и проверить функциональность сервиса.

📎 Пошаговое руководство для gRPC API

🐸Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM
⚙️ Мини-гайд по реализации MFA в .NET

Многофакторная аутентификация (MFA) — это важный инструмент для повышения безопасности приложений. Она требует подтверждения личности пользователя через два или более независимых фактора, таких как пароль и одноразовый код из приложения-аутентификатора (например, Google Authenticator).

Как это работает:
➡️Для каждого пользователя создается уникальный секретный ключ. Этот ключ используется для генерации одноразовых паролей (TOTP).

➡️Секретный ключ кодируется в формате QR-кода. Пользователь сканирует этот код своим приложением-аутентификатором, чтобы настроить MFA.

➡️После настройки приложение генерирует коды, которые действуют в течение ограниченного времени.

➡️При входе в приложение пользователь вводит код из аутентификатора. Сервер проверяет его, сравнивая с тем, что должно быть сгенерировано для данного пользователя.

Основные этапы реализации в .NET:
1️⃣ Настройте библиотеку для работы с TOTP и генерации QR-кодов.
2️⃣ Реализуйте процесс генерации секретного ключа и сохранения в базе данных.
3️⃣ Организуйте валидацию кода на сервере при каждом входе.

📎 Пример реализации с кодом

🐸Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM
👨‍💻 Кроссплатформенная разработка с .NET MAUI и Blazor Hybrid

💡 .NET MAUI и Blazor Hybrid предоставляют возможность использовать единую кодовую базу для создания приложений, работающих на мобильных устройствах, настольных системах и в вебе. Это решение для тех, кто хочет оптимизировать процесс разработки.

🎯 Чем это удобно?
• Переиспользование Razor-компонентов между вебом, мобильными и настольными приложениями.
• Единый стиль работы для разработчиков, знакомых с экосистемой .NET

Если вы хотите понять, как это работает на практике, рекомендуем ознакомиться с одной из статей, где подробно описывается процесс создания кроссплатформенного приложения на основе .NET MAUI и Blazor Hybrid.

📎 Посмотреть как разработать мультиплатформенное приложение

🐸Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM
🎵 «Кодю под windows - да, это легко»

Предлагаем послушать авторский айти ремикс о нашем любимом C#! Без наездов на джавистов не обошлось.

🎧 Слушать

🐸Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM
🌵🕵️‍♂️ Git-квест: 10 испытаний для повелителя репозиториев

Привет, шарписты! Вы пишете код, который собирается в проекты, покоряющие мир, но знаете ли вы, как не запушить .env в мастер? Этот тест — шанс доказать, что вы не только мастер LINQ, но и ветвлений в Git

✏️ Пройти тест
Please open Telegram to view this post
VIEW IN TELEGRAM
👀 Трансляция о .NET и работе с данными

Недавно прошла трансляция «.NET Data Community Standup» , на которой эксперты обсудили ключевые подходы и инструменты для оптимизации работы с данными в .NET.

🔉 Что обсудили?

➡️ Context Pooling:

• Рассказали, как эффективно управлять контекстами данных в .NET.

• Обсуждали оптимизацию ресурсов, улучшение производительности приложений и типичные случаи использования пуллинга.

➡️ Метод FromSql:

• Объяснили, как использовать необработанные SQL-запросы в Entity Framework.

• Разобрали, когда FromSql может быть полезен, а когда его лучше избегать.

➡️ Скомпилированные запросы:

• Показали, как предварительная компиляция запросов снижает накладные расходы.

• Поделились примерами, где скомпилированные запросы позволяют ускорить повторное выполнение запросов.

📎 Смотреть запись трансляции

🐸Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM
С Новым годом и Годом Змеи! 🐍 Пусть этот год принесет вам успех, рост и меньше усилий для достижения больших целей. Мы в Proglib Academy пришли с хорошими новостями в начале года.

🌟 Обновления курсов!

Мы работаем над тем, чтобы ваше обучение было проще и эффективнее. Вот что мы уже улучшили:

📈 Data Science: улучшили блок «Геометрическая прогрессия и векторная алгебра» — ключевой этап курса, который идет сразу после теории множеств.

Он закладывает фундамент для работы с данными: от анализа роста и убывания величин (геометрическая прогрессия) до понимания многомерных пространств и операций с векторами. Знания которых пригодятся в машинном обучения и аналитики.


🐍 Python: обновили курс с учетом последней версии Python 3.9.5, добавив актуальные материалы и улучшив структуру. Чтобы вы могли лучше закрепить пройденный материал, мы добавили новые интересные задачи и практические примеры.

Учебный процесс стал еще удобнее и эффективнее, а вы сможете быстрее освоить современные инструменты и техники программирования


Общие обновления:


- Перезаписали демо-курсы и презентации. Чтобы вы точно одурели с этой прикормки.
- Сократили время проверки домашних заданий, ответы теперь приходят быстрее.
- Видео теперь без перекрытий, презентации стали четче, а задания логичнее.


Но главное — мы растем для вас и с вами. Ваша обратная связь помогает нам становиться лучше. Делитесь идеями, и вместе мы создадим лучший образовательный продукт для вас!
💡 С 27.01.25 цены изменятся на 10%.

Пример: Математика для DS (Базовый): 20,990 → 23,090 ₽. Это позволяет нам делать курсы еще круче.
Давайте сделаем 2025 год годом вашего профессионального успеха! 🚀

Выбрать курс
⚡️ Автоматическая регистрация зависимостей в C#

Scrutor — это библиотека для упрощения регистрации зависимостей в контейнере инверсии управления (IoC) Microsoft.Extensions.DependencyInjection. Она позволяет автоматически сканировать сборки и регистрировать классы по заданным правилам, избавляя от необходимости вручную прописывать каждую зависимость.

💻 Пример использования
С помощью Scrutor можно зарегистрировать все классы в сборке, реализующие интерфейсы, в несколько строк:
services.Scan(scan => scan
.FromAssemblyOf<Startup>() // Сканирование текущей сборки
.AddClasses() // Добавление всех классов
.AsImplementedInterfaces() // Регистрация их как интерфейсов
.WithScopedLifetime()); // Установка времени жизни


💡 Основные возможности
• Автоматическая регистрация классов.
• Фильтрация классов по правилам (например, по имени или пространству имён).
• Настройка времени жизни (Transient, Scoped, Singleton).
• Регистрация классов с пользовательскими интерфейсами или без них.

📎 GitHub библиотеки

🐸Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM
👋 Привет, шарписты!

Есть идеи для пет-проектов? А может уже что-то делаете? Поделитесь своими задумками с сообществом! 👇 Ведь это субботний #интерактив!

Не стесняйтесь делиться своими идеями и прогрессом в их реализации. Мы уверены, что среди вас много талантливых разработчиков, которые могут создать что-то уникальное и интересное.

🐸Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM
🔄 Meadow v2: что изменилось

Команда Wilderness Labs выпустила долгожданную Meadow v2 — крупное обновление платформы для разработки IoT-устройств на базе .NET! 🚀 Если вы занимаетесь созданием умных устройств или встраиваемых систем, этот релиз точно заслуживает вашего внимания. Давайте разберем, что нового:

➡️ Meadow v2 получил серьезные улучшения в работе операционной системы, что повышает стабильность и производительность устройств.

➡️ Добавлены новые API для работы с периферией, сенсорами и другими компонентами, что упрощает разработку сложных IoT-решений.

➡️ Теперь Meadow лучше работает с различными аппаратными компонентами, что расширяет возможности для создания уникальных устройств.

➡️ Множество багов и проблем, обнаруженных в предыдущих версиях, были устранены, что делает платформу более надежной.

➡️ Wilderness Labs постарались улучшить документацию, чтобы разработчикам было проще начать работу с платформой.

📎 Полный список изменений доступен на официальной странице релиза

🐸Библиотека шарписта #новость
Please open Telegram to view this post
VIEW IN TELEGRAM
⚙️ Пайпы в F#: как писать чистый и читаемый код

Если вы работаете с F#, то наверняка слышали о пайпах (pipes). Это инструмент языка, который помогает писать код в стиле "конвейера", делая код читаемым и выразительным. Давайте разберем, как они работают и зачем их использовать.

Что такое пайпы?

Пайпы — это операторы, которые передают результат одной функции в качестве входного аргумента другой. В F# есть два оператора:

1️⃣ Прямой пайп (|>) — этот оператор передает значение слева в функцию справа b используется чаще всего. Он делает код более линейным и похожим на "конвейер".
Пример:
let add x y = x + y
let multiplyBy2 x = x * 2

// Без пайпа
let result1 = multiplyBy2 (add 3 4) // 3 + 4 = 7, затем 7 * 2 = 14

// С пайпом
let result2 = add 3 4 |> multiplyBy2 // То же самое, но более читаемо


2️⃣ Обратный пайп (<|) — этот оператор передает значение справа в функцию слева и менее популярен.
Пример:
let result = multiplyBy2 <| add 3 4 // То же, что и multiplyBy2 (add 3 4)


3. Зачем использовать пайпы?

Код становится линейным и понятным.

Не нужно вкладывать вызовы функций в скобки.

Пайпы подчеркивают функциональную природу F#.

🐸Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM
😊 Привет, шарписты!

Мы собираем данные о том, какие методы биохакинга действительно помогают разрабам улучшить качество жизни и повысить продуктивность. Поделитесь своим опытом — это поможет другим сделать осознанный выбор в мире биохакинга.

🐸Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM