C# (C Sharp) programming
По всем вопросам- @notxxx1 Реестр РКН: https://clck.ru/3Fk3kb #VRHSZ
Показати більше📈 Аналітичний огляд Telegram-каналу C# (C Sharp) programming
Канал C# (C Sharp) programming (@csharp_ci) у мовному сегменті Російська є активним учасником. На даний момент спільнота об'єднує 18 129 підписників, посідаючи 7 042 місце в категорії Технології та додатки та 36 294 місце у регіоні Росія.
📊 Показники аудиторії та динаміка
З моменту свого створення невідомо, проект продемонстрував стрімке зростання, зібравши аудиторію у 18 129 підписників.
За останніми даними від 28 серпня, 2026, канал демонструє стабільну активність. Хоча за останні 30 днів спостерігається зміна кількості учасників на -66, а за останні 24 години на -1, загальне охоплення залишається високим.
- Статус верифікації: Не верифікований
- Рівень залученості (ER): Середній показник залученості аудиторії становить 15.26%. Протягом перших 24 годин після публікації контент зазвичай збирає 7.43% реакцій від загальної кількості підписників.
- Охоплення публікацій: В середньому кожен допис отримує 2 767 переглядів. Протягом першої доби публікація в середньому набирає 1 348 переглядів.
- Реакції та взаємодія: Аудиторія активно підтримує контент: середня кількість реакцій на один пост – 0.
- Тематичні інтереси: Контент зосереджений навколо ключових тем, таких як .net, api, логика, архитектура, string.
📝 Опис та контентна політика
Автор описує ресурс як майданчик для висловлення суб'єктивної думки:
“По всем вопросам- @notxxx1
Реестр РКН: https://clck.ru/3Fk3kb
#VRHSZ”
Завдяки високій частоті оновлень (останні дані отримано 29 серпня, 2026), канал підтримує актуальність та високий рівень охоплення публікацій. Аналітика показує, що аудиторія активно взаємодіє з контентом, що робить його важливою точкою впливу в категорії Технології та додатки.
$ ls -a
А как смотрю я:
$ echo */ *. *
Этот трюк выводит всё “простым” способом через glob-расширение:
- */ покажет папки
- * покажет обычные файлы
- .* покажет скрытые файлы
Плюс это удобно тем, что результат можно сразу передавать дальше в команды, не парся вывод ls..csproj прямо сейчас.
Пакеты обычно выглядят так:
<PackageReference Include="Serilog" Version="4.3.0" />
<PackageReference Include="WolverineFx" Version="5.6.0" />
И в итоге проект превращается в мусорку из версий.
А теперь представь, что это будет так:
<PackageReference Include="Serilog" />
<PackageReference Include="WolverineFx" />
Вот в этом и кайф Central Package Management.
Что он даёт:
✅ .csproj становится чистым и читаемым
✅ никто случайно не поставит “левую” версию пакета
✅ вся команда работает на одинаковых версиях библиотек
✅ сборка становится предсказуемой и детерминированной
Как работает:
Ты управляешь версиями централизованно через файл
Directory.Packages.props в корне репозитория.
То есть версии пакетов задаются в одном месте, а проекты просто подключают зависимости без указания version.
Если у тебя монорепа или несколько проектов - это must-have.app.MapGet/MapPost превращается в ад.
Решение - авторегистрировать endpoints через DI.
Идея:
1) Делаешь общий интерфейс IEndpoint
2) Каждый endpoint реализует его
3) На старте приложения сканируешь сборку, регистрируешь все реализации в DI
4) Достаёшь их из DI и вызываешь MapEndpoints()
Плюсы:
✅ чистый Program.cs
✅ каждый endpoint в отдельном файле
✅ масштабируется без хаоса
✅ легко тестировать и поддерживать
Пример паттерна:
builder.Services.AddEndpoints(typeof(Program).Assembly);
public interface IEndpoint
{
void Map(IEndpointRouteBuilder app);
}
public static class EndpointExtensions
{
public static IServiceCollection AddEndpoints(this IServiceCollection services, Assembly assembly)
{
var endpoints = assembly.DefinedTypes
.Where(t => !t.IsAbstract && !t.IsInterface && typeof(IEndpoint).IsAssignableFrom(t))
.Select(t => ServiceDescriptor.Transient(typeof(IEndpoint), t))
.ToArray();
services.TryAddEnumerable(endpoints);
return services;
}
public static void MapEndpoints(this WebApplication app)
{
foreach (var endpoint in app.Services.GetServices<IEndpoint>())
endpoint.Map(app);
}
}appsettings.json в класс
- инжектишь настройки через DI
- приложение стартует без проблем ✅
А потом внезапно…
В прод падает , потому что:
❌ не задан обязательный ApiKey
❌ RetryCount = 0
❌ строка подключения пустая
И ты узнаёшь об этом только тогда, когда кто-то нажмёт нужную кнопку в твоем приложении.
Вот почему принцип Fail Fast критичен для конфигов:
если конфигурация невалидна - приложение не должно запускаться вообще.
Как это сделать правильно:
используй расширение Options Pattern через IValidateOptions.
Суть подхода:
1) задаём правила (например: ApiKey не null, `RetryCount > 0`)
2) регистрируем валидатор
3) если условия нарушены - DI кидает исключение сразу при старте ✅
Можно прйти дальше и подключиит FluentValidation, чтобы условия были:
- чище
- читабельнее
- удобнее расширять
Полная реализация: https://milanjovanovic.tech/blog/options-pattern-validation-in-aspnetcore-with-fluentvalidation?utm_source=X&utm_medium=social&utm_campaign=05.01.2026