🔑 Управление HttpClient по ключам
С .NET 9 можно управлять зависимостями по ключам. Буквально регистрировать и получать, к примеру, конфиги для HttpClient.
Как это работает
•
• Внедрение осуществляется с помощью атрибута
• В отличие от старых подходов с именованными или типизированными клиентами, внедрение зависимостей по ключам позволяет упростить код и уменьшить лишние вызовы фабрики
Пример регистрации и использования:
Преимущества Keyed DI
• Минимизирует необходимость вручную создавать и хранить экземпляры через
• Позволяет внедрять в сервисы и контроллеры правильно настроенные клиенты с простым указанием ключа.
• Улучшает читаемость и поддержку кода, особенно если в проекте много разных конфигураций HttpClient.
• Можно глобально включить ключевой DI для всех клиентов через
Важные моменты
• По умолчанию
• Нужно внимательно следить за временем жизни сервисов, чтобы избежать утечек памяти и проблем с соединениями.
• При ошибочном использовании ключа сервис выдаст стандартное исключение, помогая быстро находить и исправлять конфигурационные ошибки.
🔹 ML для старта в Data Science
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib
🐸 Библиотека шарписта
#il_люминатор
С .NET 9 можно управлять зависимостями по ключам. Буквально регистрировать и получать, к примеру, конфиги для HttpClient.
Как это работает
•
AddAsKeyed() — новый метод расширения для регистрации именованных HttpClient как Keyed Service в DI. Имя клиента становится ключом, по которому можно получать конкретный экземпляр.• Внедрение осуществляется с помощью атрибута
[FromKeyedServices("key")] или через Func<string, HttpClient> для динамического выбора клиента по ключу.• В отличие от старых подходов с именованными или типизированными клиентами, внедрение зависимостей по ключам позволяет упростить код и уменьшить лишние вызовы фабрики
IHttpClientFactory.Пример регистрации и использования:
var builder = WebApplication.CreateBuilder(args);
// Регистрация HttpClient с ключом "github"
builder.Services.AddHttpClient("github", c =>
{
c.BaseAddress = new Uri("https://api.github.com/");
c.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json");
c.DefaultRequestHeaders.Add("User-Agent", "dotnet");
})
.AddAsKeyed();
var app = builder.Build();
// Внедрение HttpClient по ключу "github"
app.MapGet("/", ([FromKeyedServices("github")] HttpClient httpClient) =>
{
return httpClient.GetFromJsonAsync<Repo>("/repos/dotnet/runtime");
});
app.Run();
record Repo(string Name, string Url);
Преимущества Keyed DI
• Минимизирует необходимость вручную создавать и хранить экземпляры через
IHttpClientFactory.• Позволяет внедрять в сервисы и контроллеры правильно настроенные клиенты с простым указанием ключа.
• Улучшает читаемость и поддержку кода, особенно если в проекте много разных конфигураций HttpClient.
• Можно глобально включить ключевой DI для всех клиентов через
ConfigureHttpClientDefaults.Важные моменты
• По умолчанию
AddAsKeyed() регистрирует HttpClient с областью видимости Scoped, но можно настроить и другой жизненный цикл.• Нужно внимательно следить за временем жизни сервисов, чтобы избежать утечек памяти и проблем с соединениями.
• При ошибочном использовании ключа сервис выдаст стандартное исключение, помогая быстро находить и исправлять конфигурационные ошибки.
🔹 ML для старта в Data Science
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib
#il_люминатор
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9🔥9👍3
🔄 Отмена запросов в EF
В реальных приложениях бывают ситуации, когда нужно прервать долгую операцию с базой данных, если она больше не актуальна или пользователь отменил действие.
Долгие запросы или операции сохранения могут повиснуть или перерасходовать системные ресурсы, если не предусмотрена возможность прерывания.
В Entity Framework для управления отменой используется CancellationToken. Его можно передавать в асинхронные методы, например:
Переданный CancellationToken позволяет прервать выполнение метода, если операция была отменена.
🔹 Математика для Data Science
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib
🐸 Библиотека шарписта
#sharp_view
В реальных приложениях бывают ситуации, когда нужно прервать долгую операцию с базой данных, если она больше не актуальна или пользователь отменил действие.
Долгие запросы или операции сохранения могут повиснуть или перерасходовать системные ресурсы, если не предусмотрена возможность прерывания.
В Entity Framework для управления отменой используется CancellationToken. Его можно передавать в асинхронные методы, например:
await db.SaveChangesAsync(ct);
Переданный CancellationToken позволяет прервать выполнение метода, если операция была отменена.
🔹 Математика для Data Science
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib
#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰4👍2
🧑💻 Честность в айти — это грех
В айти часто говорят, что честность — это слабость. Многие накручивают опыт, преувеличивают достижения и скрывают ошибки, чтобы выглядеть лучше в резюме.
Но без честности не бывает доверия и настоящего развития. Признание своих ошибок и реальных навыков помогает учиться и двигаться вперед, а не строить пирамиду из лжи.
💬 Как думаете лучше приврать или сказать как есть? Где ложь во благо, а где во вред? Делитесь в комментах своими размышлениями 👇
🔹 Практический интенсив «Архитектуры и шаблоны проектирования»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib
🐸 Библиотека шарписта
#entry_point
В айти часто говорят, что честность — это слабость. Многие накручивают опыт, преувеличивают достижения и скрывают ошибки, чтобы выглядеть лучше в резюме.
Но без честности не бывает доверия и настоящего развития. Признание своих ошибок и реальных навыков помогает учиться и двигаться вперед, а не строить пирамиду из лжи.
💬 Как думаете лучше приврать или сказать как есть? Где ложь во благо, а где во вред? Делитесь в комментах своими размышлениями 👇
🔹 Практический интенсив «Архитектуры и шаблоны проектирования»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib
#entry_point
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2❤1🥰1
C# мощный, но математика универсальна
ML.NET развивается, но фундамент Data Science остаётся неизменным. Чтобы эффективно работать с данными (даже в .NET-среде), нужно понимать линейную алгебру и статистику.
Мы добавили живые вебинары в наш курс по математике для AI.
Программа ближайших лекций:
—
—
—
Практика на Python (
Регистрация закрывается 9 декабря:
https://clc.to/LojFzw
ML.NET развивается, но фундамент Data Science остаётся неизменным. Чтобы эффективно работать с данными (даже в .NET-среде), нужно понимать линейную алгебру и статистику.
Мы добавили живые вебинары в наш курс по математике для AI.
Программа ближайших лекций:
—
Vectors & Matrices: операции, ранги, СЛАУ;—
Linear Regression: реализация МНК, интерпретация весов;—
SVD: матричные разложения и рекомендательные системы.Практика на Python (
NumPy), но алгоритмическая суть переносится на любой язык.Регистрация закрывается 9 декабря:
https://clc.to/LojFzw
❤1😁1
Дан массив длиной
2n в виде [x1,x2,xn,y1,y2,yn] нужно вернуть массив [x1,y1,x2,y2,xn,yn], то есть перемешать.Идея решения
Логически делим массив на две половины по
n элементов и в одном цикле по индексу i собираем ответ в новый массив result.На каждой итерации кладем сначала элемент из первой половины
nums[i] потом из второй nums[i+n].Так мы проходим вход один раз время O(
n), где n это половина массива.Решение:
public class Solution
{
public int[] Shuffle(int[] nums, int n)
{
int[] result = new int[2 * n];
int index = 0;
for (int i = 0; i < n; i++)
{
result[index++] = nums[i];
result[index] = nums[i + n];
index++;
}
return result;
}
}
Ключевой момент в том что мы никогда не выходим за границы
первая половина идет по индексам от нуля до
n минус один вторая от n до 2n минус один, а индекс в result просто сдвигается на два шага за итерацию.🔹 Практический интенсив «Архитектуры и шаблоны проектирования»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib
#dotnet_challenge
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🥱4🥰1👏1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁22
Forwarded from Библиотека собеса по C# | вопросы с собеседований
Как правильно реализовать освобождение ресурсов в IAsyncDisposable?
Короткий ответ: Реализуйте шаблон с охраной от повторного вызова: DisposeAsync() вызывает приватный DisposeAsyncCore() и синхронный Dispose(false), закрывает IAsyncDisposable ресурсы через await using, остальные — в Dispose. Используйте AsyncLazy/флаг disposed, прокидывайте CancellationToken только там, где это безопасно, и учитывайте, что await using всегда вызывает именно DisposeAsync().
🔹 Курс «Программирование на языке Python»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib
Библиотека собеса по С#
🔹 Курс «Программирование на языке Python»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib
Библиотека собеса по С#
👾12
📰 Декабрьский дайджест
Админ ждёт снега и собирает новости недели в кучу.
— Microsoft объясняет сложности управления горячими клавишами в Visual Studio 2026
Microsoft подчёркивает, что изменение горячих клавиш в Visual Studio 2026 — сложная задача из-за поддержки нескольких комбинаций для одной команды, профилей разработчиков и последовательных шорткатов.
— Бывший разработчик Microsoft потоптал Windows 11
Дейв Пламмер считает, что сейчас Windows 11 страдает от багов в обновлениях, вроде исчезновения иконки пароля на экране блокировки и дублирования процессов в Диспетчере задач.
— Microsoft предостерегает админов от устаревших .NET рантаймов
В официальном блоге Microsoft рекомендует срочно проверить наличие устаревших рантаймов и перейти на поддерживаемые версии.
— Баг в интерфейсе Windows 11 24H2 и 25H2
🔹 Программирование на языке Python
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib
🐸 Библиотека шарписта
#async_news
Админ ждёт снега и собирает новости недели в кучу.
— Microsoft объясняет сложности управления горячими клавишами в Visual Studio 2026
Microsoft подчёркивает, что изменение горячих клавиш в Visual Studio 2026 — сложная задача из-за поддержки нескольких комбинаций для одной команды, профилей разработчиков и последовательных шорткатов.
— Бывший разработчик Microsoft потоптал Windows 11
Дейв Пламмер считает, что сейчас Windows 11 страдает от багов в обновлениях, вроде исчезновения иконки пароля на экране блокировки и дублирования процессов в Диспетчере задач.
— Microsoft предостерегает админов от устаревших .NET рантаймов
В официальном блоге Microsoft рекомендует срочно проверить наличие устаревших рантаймов и перейти на поддерживаемые версии.
— Баг в интерфейсе Windows 11 24H2 и 25H2
🔹 Программирование на языке Python
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib
#async_news
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰2
Наткнулись на старый веб-артефакт — сайт, где Бритни Спирс читает курс по полупроводниковым лазерам и оптоэлектронике. Внутри не мем на один экран, а вполне учебные разборы p–n переходов, лазерных диодов и VCSEL, просто завернутые в эстетику фан-сайта двухтысячных.
Если хочется отвлечься от документации по фреймворкам и заодно освежить базу по полупроводниковым лазерам, эта старая страница сделает день чуть веселее.
🔹 Практический интенсив «Архитектуры и шаблоны проектирования»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰2
В современных приложениях важно не только загрузить настройки из конфигурации, но и убедиться, что они корректны. В .NET для этого есть удобный паттерн — Typed Options с встроенной валидацией.
Пример регистрации опций с проверкой данных:
builder.Services.AddOptions<AppOptions>()
.BindConfiguration("App")
.ValidateDataAnnotations() // Валидация по атрибутам из System.ComponentModel.DataAnnotations
.Validate(o => Uri.IsWellFormedUriString(o.ApiBaseUrl, UriKind.Absolute),
"ApiBaseUrl must be absolute") // Дополнительная кастомная проверка
.ValidateOnStart(); // Проверка при старте приложения
Что здесь происходит:
• Конфигурация из секции App автоматически связывается с классом AppOptions.
• Включена проверка на основе Data Annotations — атрибуты вроде [Required], [Range] в AppOptions валидируются автоматически.
• Добавлена кастомная валидация, которая гарантирует, что значение ApiBaseUrl — корректный абсолютный URI.
•
ValidateOnStart() заставляет приложение валидировать настройки сразу при запуске, а не при первом использовании.🔹 Специалист по ИИ
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib
#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍12❤2🔥1
Закон Брукса — это принцип управления разработкой ПО, который говорит: если проект уже опаздывает, добавление людей чаще всего только ещё больше задерживает его.
Закон сформулировал Фредерик Брукс в книге «Мифический человеко‑месяц».
Новичков нужно онбордить: рассказывать контекст, архитектуру, правила команды. Опытные ребята вместо того чтобы закрывать задачи, превращаются в живую документацию и менторов.
Параллельно растут коммуникации: больше созвонов, больше согласований, больше мест, где можно неправильно понять требования. В какой‑то момент команда тратит больше времени на разговоры и объяснения, чем на фактическую разработку.
Практический вывод простой: «давайте накинем ещё разработчиков» — плохой универсальный ответ на проблему сроков. Гораздо полезнее заранее резать систему на независимые модули, упрощать архитектуру, улучшать документацию и процессы.
А если проект уже горит, то честный пересмотр объёма, приоритизация и выкидывание лишнего часто работают лучше, чем срочный найм.
🔹 Основы IT для непрограммистов
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib
#il_люминатор
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤3🥰1
Rate limit — это простой способ защитить API от всплесков нагрузки, случайных «шторма» с клиента и банального DDoS по честным endpoint’ам.
В примере ниже на всё приложение вешается глобальный лимитер:
builder.Services.AddRateLimiter(o =>
{
o.GlobalLimiter = PartitionedRateLimiter.Create<HttpContext, string>(ctx =>
RateLimitPartition.GetFixedWindowLimiter("global", _ =>
new FixedWindowRateLimiterOptions
{
PermitLimit = 100,
Window = TimeSpan.FromSeconds(1)
}));
});
app.UseRateLimiter();
Если за текущую секунду лимит исчерпан, новые запросы начнут получать ответ об ограничении, пока не откроется следующее окно.
Дальше от этого базового варианта легко прийти к более тонким настройкам: отдельные лимиты на публичные и внутренние маршруты, разделение по API-ключу, IP или пользователю, своя политика ответа и логирование с метриками.
🔹 Алгоритмы и структуры данных
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib
#sharp_view
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤2🔥1