Внедрение конструктора / внедрение зависимости - работа с корневыми классами

В последнее время я использовал много инъекций зависимостей, разработку через тестирование и модульное тестирование, и мне это очень нравится.

Я использую конструкторские зависимости в классах, чтобы потом можно было вводить фиктивные зависимости для модульного тестирования.

Тем не менее, как лучше всего с этим справиться, когда вам действительно нужны объекты в производственной среде?

Ты используешь DependencyInjectionContainer.Get<MyClass>() везде вы хотите создать класс? Или имеет смысл создать пустой конструктор для класса, который разрешает все зависимости через контейнер DI?

1 ответ

Решение

Там нет необходимости иметь конструктор по умолчанию.

В вашем производственном коде вы, как правило, имеете всего один вызов DependencyInjectionContainer.Get(someRootType) в вашем приложении, чтобы получить корневой тип (например, HomeController класс в MVC). Поскольку все типы создаются с использованием инжектора конструктора, контейнер сможет создать для вас весь граф связанных объектов. Таким образом, с точки зрения производства нет необходимости иметь более одного конструктора.

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

Другие вопросы по тегам