Start Debugging

Тег: dependency-injection

10 статей

Как валидировать опции при старте с помощью IValidateOptions<T> в .NET 11
Реализуйте IValidateOptions<T>, зарегистрируйте его во внедрении зависимостей и добавьте ValidateOnStart, чтобы неверный appsettings.json убивал процесс, а не первый запрос, который его затронет. Разбираются перегрузка Validate<TValidator>() из .NET 11, асинхронная валидация через IAsyncValidateOptions<T> и три случая, когда ValidateOnStart молча ничего не делает.
IOptions<T> vs IOptionsSnapshot<T> vs IOptionsMonitor<T> в .NET 11
По умолчанию используйте IOptions<T>. Берите IOptionsMonitor<T>, когда синглтон должен видеть перезагрузку конфигурации, и IOptionsSnapshot<T> только тогда, когда scoped-потребителю нужно значение, стабильное в пределах одного запроса. Решает время жизни потребителя, а не форма настроек.
Как регистрировать и разрешать сервисы с ключом во внедрении зависимостей .NET 11
Зарегистрируйте несколько реализаций одного типа сервиса под ключом с помощью AddKeyedSingleton/Scoped/Transient, а затем разрешите их через [FromKeyedServices], GetRequiredKeyedService или KeyedService.AnyKey. Регистрации с ключом и без ключа находятся в раздельных таблицах, и именно это сбивает с толку почти всех.
Как использовать scoped-сервисы внутри BackgroundService в ASP.NET Core 11
BackgroundService является синглтоном, поэтому не может напрямую внедрить scoped-сервис вроде DbContext. Внедрите IServiceScopeFactory, открывайте один scope на единицу работы через CreateAsyncScope, разрешайте сервис внутри него и освобождайте scope по завершении работы.
MediatR против простых сервисных классов в 2026: должна ли смена лицензии вас сдвинуть?
Для нового кода простые сервисные классы - лучший выбор по умолчанию. Смена лицензии MediatR в июле 2025 важна, только если вы выше порога Community в 5 млн долларов или отвергаете copyleft RPL-1.5. Сохраняйте MediatR, когда pipeline behaviors несут реальную нагрузку.
2026-05-10 errorscsharpdotnet
Исправление: Unable to resolve service for type 'X' while attempting to activate 'Y'
ASP.NET Core выбрасывает это исключение, когда конструктор запрашивает тип, который никогда не был зарегистрирован, был зарегистрирован в другом контейнере или был добавлен после построения хоста. Три конкретных исправления покрывают почти все случаи.