Какой инструмент используется для внедрения зависимостей в C#?

«Какой инструмент используется для внедрения зависимостей в C#?» — вопрос из категории C# Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В экосистеме .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 важен? Он повышает тестируемость кода (легко подменить реальные зависимости моками), уменьшает связанность компонентов и упрощает управление жизненным циклом объектов.