我最常被诱惑在一些情况下使用“混合注入”。当我有一个“适当的”依赖注入构造函数时:
public class ThingMaker {
...
public ThingMaker(IThingSource source){
_source = source;
}
但对于我打算作为公共API的类(其他开发团队将使用的类),我从来找不到比写一个带有最有可能需要的依赖项的默认“流氓”构造函数更好的选择:
public ThingMaker() : this(new DefaultThingSource()) {}
...
}
显然,这里的缺点是会创建一个静态依赖于DefaultThingSource的类。理想情况下,消费者应该总是可以注入他们想要的IThingSource。然而,这太难用了;消费者希望新建一个ThingMaker并开始制作东西,几个月之后再需要时注入其他内容。在我看来,这只留下了几个选择:1.省略构造函数,强制ThingMaker的消费者理解IThingSource,并理解ThingMaker如何与IThingSource交互,然后找到或编写一个具体类,在其构造函数中调用该实例来注入。
2.省略构造函数并提供单独的工厂、容器或其他引导类/方法;以某种方式让消费者知道他们无需编写自己的IThingSource;强制ThingMaker的消费者查找和理解工厂或引导程序,并使用它。
3.保留构造函数,使消费者能够“new up”一个对象并运行它,并处理对DefaultThingSource的可选静态依赖。
嗯,第三个选择似乎很有吸引力。还有其他更好的选择吗?选项1或2似乎不值得这样做。