Sobes.tech
Назад к вопросам
Intern — Junior
60

Для чего используется внедрение зависимостей в программных модулях?

Компании, где спрашивали
Swiftfactory

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Внедрение зависимостей используют, чтобы модуль не создавал свои зависимости сам, а получал их извне. Это снижает связность, упрощает тестирование и делает код гибче для замены реализаций. В C# это обычно применяется через конструктор, свойства или метод.

Определение:

Внедрение зависимостей (Dependency Injection, DI) — это подход, при котором объект получает нужные ему зависимости извне, а не создаёт их внутри себя. Например, класс не создаёт Logger через new, а принимает его в конструкторе. Это позволяет легче менять реализацию, подменять зависимости в тестах и собирать приложение из независимых компонентов.

Пример использования:

Допустим, есть сервис заказа, которому нужен логгер.

public interface ILogger
{
    void Log(string message);
}

public class ConsoleLogger : ILogger
{
    public void Log(string message)
    {
        Console.WriteLine(message);
    }
}

public class OrderService
{
    private readonly ILogger _logger;

    public OrderService(ILogger logger)
    {
        _logger = logger;
    }

    public void CreateOrder()
    {
        _logger.Log("Order created");
    }
}

Здесь OrderService не зависит от конкретного ConsoleLogger, а работает через интерфейс ILogger. В тестах можно подставить другой логгер, например заглушку.

Пояснение кода:

  1. ILogger задаёт контракт: любой логгер должен уметь писать сообщение.
  2. ConsoleLogger — конкретная реализация, которая выводит текст в консоль.
  3. OrderService объявляет зависимость через поле _logger.
  4. В конструктор OrderService передаётся объект, реализующий ILogger.
  5. При вызове CreateOrder() сервис использует уже готовый логгер, не создавая его сам.
  6. За счёт этого класс становится проще тестировать и менять без переписывания внутренней логики.

Ключевые моменты:

  • DI уменьшает жёсткую связность между классами.
  • Код становится проще тестировать, потому что зависимости можно подменять.
  • Легче менять реализацию без изменений в потребляющем классе.
  • Основной вариант в C# — внедрение через конструктор.
  • DI хорошо сочетается с интерфейсами и контейнерами внедрения зависимостей.
  • Это не только про паттерн, но и про архитектурный принцип построения гибкого кода.