Ответ
В экосистеме .NET для внедрения зависимостей (Dependency Injection, DI) применяется несколько инструментов. Основные из них:
1. Встроенный контейнер (IServiceCollection)
Стандартный выбор для ASP.NET Core и других приложений .NET. Регистрация сервисов происходит в Program.cs или Startup.cs.
// Регистрация сервисов с разным временем жизни
var services = new ServiceCollection();
// Transient — новый экземпляр при каждом запросе
services.AddTransient<IMyService, MyService>();
// Scoped — один экземпляр на область видимости (например, HTTP-запрос)
services.AddScoped<IDbContext, AppDbContext>();
// Singleton — один экземпляр на всё время работы приложения
services.AddSingleton<ICacheService, CacheService>();
2. Сторонние контейнеры Используются для сложных сценариев, требующих расширенного функционала (например, автоматическая регистрация по соглашениям, перехват вызовов).
- Autofac — популярный контейнер с поддержкой модулей и детальной настройкой.
- Simple Injector — фокус на производительность и проверку корректности графа зависимостей на этапе запуска.
- Ninject — известен гибкой привязкой через модули.
- Castle Windsor — мощный контейнер с обширными возможностями.
Почему DI важен? Он повышает тестируемость кода (легко подменить реальные зависимости моками), уменьшает связанность компонентов и упрощает управление жизненным циклом объектов.