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

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

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

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

РКН: https://gosuslugi.ru/snet/67a5c81cdc130259d5b7fead
Download Telegram
🆚 Микросервисная архитектура vs Монолит

Монолит — это традиционный подход к разработке, где всё приложение представляет собой единое целое. Весь код, бизнес-логика, UI и доступ к данным находятся в одном проекте и деплоятся как единая единица.

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

Каждый сервис отвечает за конкретную бизнес-функцию, имеет свою базу данных и может разрабатываться, деплоиться и масштабироваться независимо.

Каждый сервис — это отдельное .NET приложение (мини-монолит) со своей БД, API и бизнес-логикой.

Ключевые отличия

➡️ Структура и организация кода

Монолит:

• Один репозиторий, один проект
• Общие зависимости для всех модулей
• Прямые вызовы методов между компонентами

Микросервисы:

• Множество репозиториев или монорепозиторий
• Независимые зависимости для каждого сервиса
• Коммуникация через API: HTTP, gRPC, сообщения

➡️ Развертывание

Монолит:

• Деплой всего приложения целиком
• Один сервер или кластер серверов
• Простая инфраструктура

Микросервисы:

• Независимый деплой каждого сервиса
• Контейнеризация и оркестрация
• Сложная инфраструктура с API Gateway, Service Discovery

➡️ Масштабирование

Монолит:

• Вертикальное масштабирование — увеличение ресурсов сервера
• Горизонтальное масштабирование всего приложения
• Неэффективно, если нагрузка только на одну функцию

Микросервисы:

• Горизонтальное масштабирование конкретных сервисов
• Масштабируются только те части, которым нужно
• Оптимизация затрат на инфраструктуру

➡️ База данных

Монолит:

• Одна общая база данных
• ACID транзакции работают нативно
• Простота в управлении данными

Микросервисы:

• База данных на каждый сервис
• Распределенные транзакции
• Eventual Consistency

➡️ Технологический стек

Монолит:

• Единый стек технологий
• Сложно внедрить новые технологии
• Один язык программирования

Микросервисы:

• Каждый сервис может использовать свой стек
• Гибкость в выборе технологий
• Можно смешивать .NET, Node.js, Python и др.

Микросервисы — не серебряная пуля, а инструмент для решения конкретных проблем масштаба и сложности.

📍 Навигация: ВакансииЗадачиСобесы

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

#il_люминатор
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🥱5
💿 S.M.A.R.T. уже знает, что с вашим диском

Диск умирает тихо. Сначала один переназначенный сектор, потом десять, потом в один прекрасный день файлы просто не открываются. Хорошо, если это была музыка. Плохо, если рабочие документы за три года.

Как давно вы проверяли свои файловые хранилища?

Как раз вышла новая версия CrystalDiskInfo. Ничего революционного — но повод скачать актуальную сборку и наконец запустить её.

➡️ Проверить диск

📍 Навигация: ВакансииЗадачиСобесы

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

#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🥰3
⚡️ Синхронная коммуникация: HTTP/REST и gRPC

Когда мы говорим о взаимодействии между сервисами, первое, что приходит в голову — синхронный вызов. Один сервис спрашивает, другой отвечает. Просто, понятно, привычно. Разберёмся, какие инструменты есть в .NET и когда каждый из них уместен.

HTTP/REST — разумный дефолт

Большинство проектов начинается именно с REST. Низкий порог входа, понятная отладка через браузер или Postman, огромная экосистема. В .NET для этого используют HttpClient через IHttpClientFactory.

Создание нового HttpClient на каждый запрос — классическая ошибка, которая приводит к исчерпанию сокетов под нагрузкой.

builder.Services.AddHttpClient<IOrderService, OrderService>(client =>
{
client.BaseAddress = new Uri("https://orders-api/");
client.DefaultRequestHeaders.Add("Accept", "application/json");
client.Timeout = TimeSpan.FromSeconds(30);
});

public class OrderService(HttpClient client) : IOrderService
{
public async Task<Order?> GetAsync(Guid id, CancellationToken ct)
{
var response = await client.GetAsync($"orders/{id}", ct);
response.EnsureSuccessStatusCode();
return await response.Content.ReadFromJsonAsync<Order>(ct);
}
}


Сразу добавляйте Polly для повторных попыток и circuit breaker. Без этого первый же временный сбой соседнего сервиса положит весь флоу.

Когда не стоит использовать: если между сервисами тысячи вызовов в секунду с жёсткими требованиями по latency — смотрите в сторону gRPC.

gRPC — когда миллисекунды на счету

gRPC работает поверх HTTP/2, использует бинарную сериализацию через Protocol Buffers и генерирует типизированный клиент из .proto-файла. Это означает меньше трафика, меньше CPU на сериализацию и строгий контракт, нарушение которого не скомпилируется.

// orders.proto
service Orders {
rpc GetOrder (OrderRequest) returns (OrderReply);
}
message OrderRequest { string id = 1; }
message OrderReply { string id = 1; string status = 2; }

// в сервисе
builder.Services.AddGrpcClient<OrdersClient>(o =>
o.Address = new Uri("https://orders-grpc-service"));

public class OrderHandler(OrdersClient grpc)
{
public async Task<OrderReply> Handle(GetOrderQuery q, CancellationToken ct)
=> await grpc.GetOrderAsync(
new OrderRequest { Id = q.Id.ToString() },
cancellationToken: ct);
}


Подводный камень: не тащите gRPC туда, где достаточно REST. Если у вас 10 запросов в минуту — вы просто добавите сложность без выигрыша в производительности.

Публичный API или фронтенд — REST без вариантов. Internal-сервисы с высокой нагрузкой и строгим контрактом — gRPC. Если сомневаетесь — начните с REST, профилируйте, и переходите на gRPC там, где это реально болит.

📍 Навигация: ВакансииЗадачиСобесы

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

#il_люминатор
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🥱71💯1
🤩 Microsoft раскрыла планы по развитию PowerShell и OpenSSH

Пока Microsoft работает над устранением болевых точек Windows 11, компания параллельно вкладывается в инструменты для опытных пользователей.

PowerShell 7.7 станет центральным обновлением года. Среди ключевых изменений: профили и модули переедут из папки Documents в более подходящее место, появится возможность загружать модули без правки профиля, отложенные уведомления об обновлениях для пакетных менеджеров, поддержка псевдонимов и макросов в стиле Bash, а также собственный MCP-сервер.

Windows OpenSSH может получить поддержку аутентификации через EntraID.

➡️ Источник

📍 Навигация: ВакансииЗадачиСобесы

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

#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
👍82❤‍🔥2
📎 Парсим HTML в C#

FreeSpire.Doc для .NET — профессиональная библиотека для обработки документов. Она позволяет разработчикам на C# читать, анализировать и извлекать HTML-контент с минимальным количеством кода и без внешних зависимостей.

Установка через NuGet:
Install-Package FreeSpire.Doc


Необходимые неймспейсы:
using Spire.Doc;
using Spire.Doc.Documents;
using Spire.Doc.Fields;
using System;
using System.IO;
using System.Text.RegularExpressions;


Кейс 1. Извлечение текста из HTML-строки

Библиотека справляется с обработкой динамически генерируемых HTML-фрагментов, например, контента из фронтенд-редакторов или HTML-строк, возвращаемых API.

string htmlContent = @"
<html>
<body>
<h2>Описание возможностей продукта</h2>
<p>Этот компонент поддерживает<span style='font-size:14px;'> парсинг HTML</span> и имеет следующие преимущества:</p>
<ul>
<li>Кроссплатформенная совместимость .NET</li>
<li>Не зависит от Office</li>
<li>Быстрое извлечение текста</li>
</ul>
</body>
</html>
";

Document parseDoc = new Document();
Section section = parseDoc.AddSection();
Paragraph paragraph = section.AddParagraph();

try
{
// Ключевой метод: загрузка и парсинг HTML
paragraph.AppendHTML(htmlContent);

// Извлечение чистого текста
string pureText = parseDoc.GetText();

// Очистка текста от лишних пробелов
pureText = Regex.Replace(pureText, @"\s+", " ").Trim();

Console.WriteLine("Извлечённый текст:");
Console.WriteLine(pureText);
}
finally
{
parseDoc.Dispose();
}


Кейс 2. Извлечение структурированного контента из файла

При работе с локально сохранёнными HTML-файлами чаще нужно извлечь конкретные структурированные данные: заголовки, списки, гиперссылки.

string htmlFilePath = "sample.html";

Document parseDoc = new Document();
parseDoc.LoadFromFile(htmlFilePath);

// Извлечение заголовков (h1-h6)
foreach (Section sec in parseDoc.Sections)
{
foreach (Paragraph para in sec.Paragraphs)
{
if (para.GetStyle().Name.StartsWith("Heading"))
{
Console.WriteLine(para.Text.Trim());
}
}
}

// Извлечение элементов списков
foreach (Section sec in parseDoc.Sections)
{
foreach (Paragraph para in sec.Paragraphs)
{
if (para.ListFormat.ListType != ListType.NoList)
{
Console.WriteLine(para.Text.Trim());
}
}
}

// Извлечение гиперссылок
foreach (Section sec in parseDoc.Sections)
{
foreach (Paragraph para in sec.Paragraphs)
{
foreach (DocumentObject docObj in para.ChildObjects)
{
if (docObj is Field field && field.Type == FieldType.FieldHyperlink)
{
string linkText = field.FieldText;
string linkUrl = field.GetFieldCode().Split('"')[1];
Console.WriteLine($"Текст: {linkText}, URL: {linkUrl}");
}
}
}
}


Лучшие практики:

• Всегда оборачивайте Document в using или вызывайте Dispose() для освобождения ресурсов

• Проверяйте существование файлов и обрабатывайте исключения парсинга

• Обрабатывайте извлечённый текст с помощью Regex.Replace для нормализации пробелов

📍 Навигация: ВакансииЗадачиСобесы

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

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤‍🔥6
Интегрируем AI в .NET экосистему

Бизнес требует внедрения AI, но не в виде игрушки, а как надёжного сервиса. Мы пересобрали курс «Разработка AI-агентов», сделав упор на промышленные стандарты и архитектуру.

В программе:

🔹 От демо к инжинирингу. Управление ресурсами, кэширование, роутинг и контроль затрат (FinOps для AI).

🔹 RAG нового уровня. Пайплайны для работы с «грязными» данными, таблицами и корпоративными базами знаний.

🔹 LangGraph PRO. Управляемые графы состояний, time-travel для отладки и возможность отката действий.

🔹 Юридический контур. Развёртывание решений с учётом 152-ФЗ.

Стартуй сейчас!
Материалы пре-подготовки доступны сразу.

🎟 Промокод Agent — скидка 10 000 ₽ (до 28 февраля).

👉 Инженерный подход к AI
🥱2
📈 Подборка вакансий для шарпистов

.NET-разработчик — от 250 000 ₽, удалёнка

C#/.NET-разработчик — 265 000 ₽, Офис/Гибрид в Екатеринбурге

Middle/Senior .NET Developer — до 3 500 $, удалёнка

➡️ Еще больше топовых вакансий — в нашем канале C# Jobs

🐸 Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM
2
🧩 API Gateway в .NET

API Gateway — это единая точка входа, которая берёт на себя маршрутизацию, аутентификацию, rate limiting и агрегацию запросов. Клиент общается с одним адресом — Gateway сам разбирается, куда слать запрос.

Ocelot vs YARP

Ocelot — классика жанра. Конфигурируется через JSON, прост в старте:
{
"Routes": [{
"UpstreamPathTemplate": "/api/orders/{id}",
"DownstreamPathTemplate": "/orders/{id}",
"DownstreamHostAndPorts": [{"Host": "orders-svc", "Port": 80}]
}]
}


YARP — от Microsoft, более гибкий. Конфигурируется и через JSON, и прямо в коде:
builder.Services.AddReverseProxy()
.LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"));


Микросервисы не занимаются проверкой токенов — это задача Gateway. Один раз настроите JWT-валидацию:
app.MapReverseProxy(pipeline => {
pipeline.UseAuthentication();
pipeline.UseAuthorization();
});


И все сервисы за Gateway уже защищены.

📍 Навигация: ВакансииЗадачиСобесы

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

#il_люминатор
Please open Telegram to view this post
VIEW IN TELEGRAM
👍133🤔1
📎 Новая фича C#

В C# 15 появится возможность передавать аргументы в конструктор или фабричный метод коллекции прямо внутри выражения коллекции — через элемент with(...).

Раньше, если нужно было создать List<string> с заданной ёмкостью или HashSet<string> с нестандартным компаратором, приходилось делать это отдельно. Теперь всё пишется в одну строку:
// Задаём начальную ёмкость списка
List<string> names = [with(capacity: values.Length * 2), .. values];

// Передаём компаратор в HashSet
HashSet<string> set = [with(StringComparer.OrdinalIgnoreCase), "Hello", "HELLO", "hello"];
// В set окажется один элемент — все строки равны при OrdinalIgnoreCase


with(...) должен быть первым элементом в выражении коллекции.

Фича полезна там, где важна производительность: можно сразу зарезервировать нужный размер буфера и избежать лишних реаллокаций.

📍 Навигация: ВакансииЗадачиСобесы

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

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔11👍4🌚42👾2
👨‍💻 Конец эпохи State Machine

Все мы знаем и любим async/await. Но знаете ли вы, что под капотом происходило всё это время?

Каждый раз когда вы писали async метод — компилятор переписывал его в большой конечный автомат. Вместо вашего чистого кода генерировался struct, реализующий IAsyncStateMachine, с MoveNext(), switch-блоками и кучей вспомогательных полей.

Microsoft перенесла управление async из компилятора прямо в рантайм. Теперь компилятор больше не генерирует конечный автомат — он просто помечает метод атрибутом [MethodImpl(MethodImplOptions.Async)] и делает шаг назад.

Рантайм сам перехватывает await-точки через AsyncHelpers.Await(...), сохраняет только нужные переменные и возобновляет выполнение когда Task готов.

Что это даёт:

• Zero allocation в happy path — никакого лишнего боксинга
• Читаемые стектрейсы с вашими именами методов, а не MoveNext
• Рантайм понимает async-семантику и может оптимизировать цепочки await
• Native AOT поддержка из коробки

Как включить сейчас:
<Features>$(Features); runtime-async=on</Features>
<EnablePreviewFeatures>true</EnablePreviewFeatures>
<TargetFramework>net11.0</TargetFramework>


Это самое крупное изменение в async-инфраструктуре .NET за последние годы.

📍 Навигация: ВакансииЗадачиСобесы

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

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
57🔥13👍11🤔6🥰1
🤩 Regex вместо while-loop

Классический паттерн очистки строк, который встречается в приложениях:
while (text.Contains(" "))
{
text = text.Replace(" ", "");
}


На первый взгляд — читаемо и предсказуемо. На практике — источник проблем под нагрузкой.

Строки в .NET иммутабельны. Каждый вызов Replace() — это полная аллокация новой строки, копирование содержимого и выброс старого объекта на съедение GC. При длинных прогонах повторяющихся символов цикл делает это многократно. Сложность — O(n²), давление на GC — ощутимое.

Правильная замена — Regex.Replace с квантификатором +:
text = Regex.Replace(text, @"-+", "-");


Один проход по строке, одна аллокация результата, линейная сложность.«+» означает одно или более вхождений подряд — именно то, что имелось в виду в цикле, но выражено декларативно.

Оптимальный вариант для .NET 8+ — Source-Generated Regex:
public partial class StringNormalizer
{
[GeneratedRegex(@"-+")]
private static partial Regex ConsecutiveDashRegex();

public static string NormalizeSlug(string input)
=> ConsecutiveDashRegex().Replace(input, "-");
}


Атрибут [GeneratedRegex] переносит компиляцию паттерна на этап сборки. В рантайме — никакого парсинга, никаких лишних аллокаций при инициализации, валидация паттерна прямо в IDE.

📍 Навигация: ВакансииЗадачиСобесы

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

#il_люминатор
Please open Telegram to view this post
VIEW IN TELEGRAM
👍286😁4🌚2
👩‍💻 Гендерный разрыв в IT

Женщины в IT получают на 40% меньше мужчин — и первый порыв объяснить это дискриминацией. Но если копнуть в данные, картина усложняется. Разрыв формируется ещё в вузе, продолжается в выборе специализации и усиливается декретом.

➡️ Разбираем, где именно ломается воронка

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека шарписта
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🌚6👾1
Что не так с кодом

В коде спрятан намёк на обновление, которое принёс нам C# 10 версии. Может публичные поля? Или конструктор.. Явно что-то связанное со структурой.

👉 Ответ 👈

📍 Навигация: ВакансииЗадачиСобесы

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

#dotnet_challenge
Please open Telegram to view this post
VIEW IN TELEGRAM
LLM в корпоративном .NET: от хаоса к управляемой архитектуре

Бизнес массово требует внедрять ИИ в корпоративные системы. Но базовые боты ломаются о реальные задачи, уходят в бесконечные циклы и нарушают политики безопасности.

Мы обновили курс по AI-агентам, сделав упор на enterprise-стандарты 2026 года. Теперь это инженерный гайд по созданию стабильных, измеримых и безопасных систем, которые не страшно пускать в продакшн.

Что мы разбираем на курсе:

— хардкорный RAG: парсинг кривых корпоративных сканов, таблиц и улучшение поисковых запросов;
— оркестрация: маршрутизация, human-in-the-loop для критичных решений и восстановление состояний;
— контроль затрат: детальное управление токенами, кэшем и предотвращение перегрузок;
— автоматизация: управление браузером и интеграция с legacy-продуктами;
— правовой контур: разворачивание решений с соблюдением 152-ФЗ и подготовка документов.

Активируйте промокод Agent до 28 февраля и забирайте скидку 10 000 рублей.

Используя акцию «3 курса по цене 1», вы можете выбрать ещё два курса в подарок.

Построить надёжных AI-агентов
🤔1
🤨 Переходить на .NET 10 или нет

.NET 10 вышел в ноябре 2025 года — и это LTS-релиз, то есть Microsoft будет поддерживать его несколько лет. Хорошая база для прода.

Основные изменения крутятся вокруг трёх вещей: производительность, язык и экосистема. JIT-компилятор стал агрессивнее инлайнить вызовы и оптимизировать аллокации, что на CPU-интенсивных и API-нагруженных сценариях даёт до 5–30% прироста на горячих путях.

C# 14 добавил extension members, field-backed properties и ряд мелких улучшений, которые заметно сократят бойлерплейт у авторов библиотек. EF Core тоже стал быстрее на ряде запросов.

Если у вас покрытый тестами прод, нормальный CI и необходимость в долгосрочной поддержке — мигрировать стоит.

План простой: сначала апгрейдите изолированный сервис или библиотеку, снимите замеры P95/P99 и аллокаций до и после, убедитесь что всё работает — и масштабируйте.

Для старта можно использовать официальный инструмент:
dotnet tool install -g upgrade-assistant
upgrade-assistant upgrade MySolution.sln


Он автоматически находит потенциальные проблемы и обновляет .csproj — но слепо доверять ему не стоит, результаты лучше перепроверить вручную.

Есть смысл повременить, если критические NuGet-пакеты ещё не выпустили совместимые версии, у команды нет ресурса на полноценный migration sprint, или впереди крупный релиз и незачем добавлять риски.

📍 Навигация: ВакансииЗадачиСобесы

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

#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
👏8👍41🔥1
AI-агенты в экосистеме .NET: строим надёжный Production в 2026 году

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

📚 В обновлённой программе:

— инжиниринг качества: измерение метрик производительности и устранение регрессий;
— промышленный RAG: продвинутые подходы к обработке разнородных документов;
human-in-the-loop: встраивание человека в критические узлы принятия решений;
— юридические аспекты: детальное руководство по использованию 152-ФЗ.

Начните учиться уже сейчас — материалы для предварительной подготовки доступны сразу после регистрации.

Специальные условия до 28 февраля:

— введите промокод Agent для получения скидки 10 000 рублей**;
— участвуйте в **акции «3 курса по цене 1» — выберите два любых курса в дополнение к основному.

👉 Получить доступ к курсу и подаркам
🤑 Мы ждали этого несколько месяцев

Что вы будете делать в этот дополнительный выходной?

Полная раскайфовка на кровати или жёсткий пет-проектинг?

💬 Пишите в комментах 👇

📍 Навигация: ВакансииЗадачиСобесы

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

#entry_point
Please open Telegram to view this post
VIEW IN TELEGRAM
2