我最近一直在使用很多依赖注入,测试驱动开发和单元测试,并开始喜欢它。
我在类中使用构造函数依赖项,以便我可以为单元测试注入模拟依赖项。
但是,当您真正想要生产环境中的对象时,处理它的最佳方法是什么?
您是否在想要创建课程的任何地方使用DependencyInjectionContainer.Get<MyClass>()
?或者为类创建一个空白构造函数更有意义,它通过DI容器解析所有依赖项?
答案 0 :(得分:2)
不需要默认构造函数。
在您的生产代码中,您通常只需在应用程序中调用DependencyInjectionContainer.Get(someRootType)
即可获得根类型(例如MVC中的HomeController
类)。由于所有类型都是使用构造函数注入创建的,因此容器将能够为您创建相关对象的整个图形。因此,从生产角度来看,不需要有多个构造函数。
由于在单元测试中通常需要注入所有模拟对象,因此测试也不会使用默认构造函数。另一方面,让每个测试直接调用被测试类的构造函数很快就会导致难以维护的代码,因为在构造函数更改时您将不得不更改所有测试。相反,将该逻辑集中到测试类中的工厂方法。此工厂方法可以有多个重载,以便测试可以轻松创建测试类。