Ответ
В ASP.NET Core Dependency Injection контейнер поддерживает следующие основные виды регистрации (времена жизни):
-
Transient — создаётся новый экземпляр при каждом запросе зависимости. Подходит для лёгких, не имеющих состояния сервисов.
services.AddTransient<IService, ServiceImplementation>(); -
Scoped — один экземпляр создаётся в рамках одной области видимости (scope). В веб-приложении область видимости обычно соответствует одному HTTP-запросу.
services.AddScoped<IService, ServiceImplementation>(); -
Singleton — один экземпляр на всё время работы приложения. Используйте с осторожностью, учитывая потокобезопасность.
services.AddSingleton<IService, ServiceImplementation>();
Также доступны дополнительные способы регистрации:
- Регистрация экземпляра (Instance): Предоставление уже созданного объекта.
services.AddSingleton<IService>(existingInstance); - Регистрация через фабрику (Factory): Позволяет управлять логикой создания экземпляра.
services.AddTransient<IService>(serviceProvider => new ServiceImplementation(serviceProvider.GetRequiredService<ILogger>()) );
Сторонние контейнеры (например, Autofac) часто расширяют эти возможности, добавляя Keyed/Named регистрации (регистрация нескольких реализаций под разными ключами) и поддержку декораторов.