Внедрение конструктора / внедрение зависимости - работа с корневыми классами
В последнее время я использовал много инъекций зависимостей, разработку через тестирование и модульное тестирование, и мне это очень нравится.
Я использую конструкторские зависимости в классах, чтобы потом можно было вводить фиктивные зависимости для модульного тестирования.
Тем не менее, как лучше всего с этим справиться, когда вам действительно нужны объекты в производственной среде?
Ты используешь DependencyInjectionContainer.Get<MyClass>()
везде вы хотите создать класс? Или имеет смысл создать пустой конструктор для класса, который разрешает все зависимости через контейнер DI?
1 ответ
Там нет необходимости иметь конструктор по умолчанию.
В вашем производственном коде вы, как правило, имеете всего один вызов DependencyInjectionContainer.Get(someRootType)
в вашем приложении, чтобы получить корневой тип (например, HomeController
класс в MVC). Поскольку все типы создаются с использованием инжектора конструктора, контейнер сможет создать для вас весь граф связанных объектов. Таким образом, с точки зрения производства нет необходимости иметь более одного конструктора.
Поскольку в ваших модульных тестах вы обычно хотите внедрить все фиктивные объекты, ваши тесты также не будут использовать конструктор по умолчанию. С другой стороны, если позволить каждому тесту напрямую вызывать конструктор тестируемого класса, это приведет к тому, что код будет трудно поддерживать, поскольку вам придется изменять все тесты при изменении конструктора. Вместо этого централизуйте эту логику для фабричного метода в тестовом классе. Этот фабричный метод может иметь несколько перегрузок, чтобы тесты могли легко создавать тестируемый класс.