Контейнер IoC обычно полезен для внедрения объекта, который имеет состояние; или классы или интерфейсы, которые имеют более одной реализации, даже если вторая реализация является ложной для целей тестирования. Если ни один из них не является правдой, вы ничего не получите, вводя его. самая распространенная в наши дни идиома - это чтобы ваш класс находился в интерфейсе, который могут быть реализованы как реальной, так и фиктивной реализацией.
1) Статические методы на вспомогательных классах - Нет, они не часто вводятся IoC. Обычно это утилиты без гражданства.
Чтобы использовать очень простой пример, вам не нужны две версии служебного метода с именем StringUtils.Reverse()
. Вам нужен только один, и вы можете легко написать тесты вокруг него, потому что он не имеет состояния или зависимостей, поэтому абсолютно бесполезно его выводить из строя. Пример теста:
string reversedString = StringUtils.Reverse("input");
Assert.AreEqual("tupni", reversedString)
Если утилита на самом деле не имеет состояния (например, зависит от HttpContext.Current), то вы должны сделать зависимость явной, введя ее, а не сделав утилиту статичной.
2) Синглтоны : Часто да, синглтоны вводятся инъекцией. Но хорошо в IoC то, что вы меньше беспокоитесь о том, есть ли что-то одно или нет. Вы получаете гибкость в создании экземпляров с помощью IoC. Решение о том, чтобы каждый раз иметь конкретный тип в виде одиночного или нового экземпляра, становится частью конфигурации контейнера IoC, и больше ничего в коде не нужно менять.
Таким образом, синглтон-капот перестает быть отдельной проблемой, которая должна быть закодирована в классе (а классы, имеющие несколько проблем, когда им не нужно, это плохо), и это становится проблемой контейнера IoC. Вы больше не кодируете класс «как синглтон» с чем-то особенным, таким как приватный конструктор и метод public static GetInstance()
, вы просто кодируете его для основной задачи, в то время как конфигурация контейнера IoC указывает, является ли он синглтоном или нет или где-то посередине, например, один экземпляр на поток.
3) Статические классы - естественный дом для статических методов. Рассмотрите возможность создания методов расширения статических методов там, где это необходимо. Вы не можете внедрить эти классы, так как вы не можете их создать. Использование статических классов создает процедурный не объектно-ориентированный код. Это не плохо для небольших вспомогательных методов, но если большая часть кода такая, то вы не используете мощные функции OO платформы .Net.