Какие DI-контейнеры (контейнеры внедрения зависимостей) вы знаете для .NET?

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

Ответ

В экосистеме .NET доступно несколько популярных контейнеров внедрения зависимостей (IoC-контейнеров), каждый со своими сильными сторонами.

Основные контейнеры:

  1. Встроенный контейнер Microsoft (Microsoft.Extensions.DependencyInjection)

    • Описание: Стандартный, "из коробки", контейнер в ASP.NET Core. Простой, быстрый и хорошо интегрирован с фреймворком.
    • Когда использовать: Для большинства приложений ASP.NET Core, особенно когда не требуются продвинутые функции.
    • Пример регистрации:
      // В Program.cs
      builder.Services.AddScoped<IEmailService, EmailService>();
      builder.Services.AddSingleton<ICacheService, CacheService>();
      builder.Services.AddTransient<IDataProcessor, DataProcessor>();
  2. Autofac

    • Описание: Мощный и гибкий контейнер с поддержкой модулей, перехвата (interception), сложных жизненных циклов и динамической регистрации.
    • Когда использовать: В крупных enterprise-приложениях, где нужны модульность, AOP или более тонкий контроль над разрешением зависимостей.
    • Пример:
      var builder = new ContainerBuilder();
      builder.RegisterType<ReportService>().As<IReportService>().InstancePerLifetimeScope();
      builder.RegisterModule(new LoggingModule()); // Модульная регистрация
  3. Simple Injector

    • Описание: Контейнер, ориентированный на производительность и проверку корректности графа зависимостей на этапе компиляции/запуска. Обеспечивает высокую скорость разрешения.
    • Когда использовать: Когда критична производительность и важна ранняя диагностика ошибок в конфигурации DI.
    • Пример:
      var container = new Container();
      container.Register<IUserRepository, SqlUserRepository>(Lifestyle.Scoped);
      container.Verify(); // Строгая проверка графа
  4. Scrutor

    • Описание: Не самостоятельный контейнер, а библиотека-надстройка над встроенным контейнером Microsoft. Добавляет возможности для сканнирования сборок и автоматической регистрации по соглашениям.
    • Когда использовать: Когда хочется сохранить стандартный контейнер, но избежать ручной регистрации множества сервисов.
    • Пример:
      builder.Services.Scan(scan => scan
          .FromAssemblyOf<ITransientService>()
          .AddClasses(classes => classes.AssignableTo<ITransientService>())
              .AsImplementedInterfaces()
              .WithTransientLifetime()
          );
  5. Ninject & Unity

    • Описание: Ранее были очень популярны, но в контексте современных ASP.NET Core приложений их использование сократилось в пользу Autofac или Simple Injector. Unity изначально от Microsoft.

Критерии выбора: Для нового проекта на ASP.NET Core разумно начать со встроенного контейнера. Autofac или Simple Injector стоит рассматривать при росте сложности проекта, требований к производительности или необходимости модульности.