【发布时间】:2012-04-12 12:21:55
【问题描述】:
我正在编写一个库,它将为其消费者提供公共类型的集合。
我想让这个库依赖注入中的类型变得友好。这意味着每个类都需要有一个构造函数,通过它可以指定被初始化对象的每个依赖项。我还希望库遵守配置原则的约定。这意味着如果消费者想要默认行为,他可以使用无参数构造函数,并且对象会以某种方式为自己构建依赖关系。
在示例 (C#) 中:
public class Samurai {
private readonly IWeapon _weapon;
// consumers will use this constructor most of the time
public Samurai() {
_weapon = ??? // get an instance of the default weapon somehow
}
// consumers will use this constructor if they want to explicitly
// configure dependencies for this instance
public Samurai(IWeapon weapon) {
_weapon = weapon;
}
}
我的第一个解决方案是使用服务定位器模式。
代码如下所示:
...
public Samurai() {
_weapon = ServiceLocator.Instance.Get<IWeapon>();
}
...
不过,我对此有疑问。服务定位器已被标记为反模式 (link),我完全同意这些论点。另一方面,Martin Fowler 提倡在这种情况下(图书馆项目)使用服务定位器模式(link)。我想小心并消除在发现服务定位器确实是个坏主意后重写库的可能必要性。
因此,总而言之 - 您认为服务定位器在这种情况下是否合适?我应该以完全不同的方式解决我的问题吗?欢迎任何想法......
【问题讨论】:
标签: dependency-injection inversion-of-control default-value service-locator