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