我正在编写一个库,它将向其消费者提供一个公共类型的集合。库项目中构造函数参数的缺省值
我想使这个库的依赖注入友好的类型。这意味着每个类都需要一个构造函数,通过它可以指定被初始化的对象的每个依赖项。我也希望图书馆遵守约定而不是配置原则。这意味着如果消费者想要默认行为,他可以使用无参数构造函数,并且该对象将以某种方式为其自身构建依赖关系。
在示例(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)。我想要小心一点,并避免在显示服务定位器确实是个坏主意后重写库的可能性。
所以最后 - 你认为服务定位器在这种情况下罚款吗?我应该以完全不同的方式解决我的问题吗?任何想法是值得欢迎...
保持DI类友好很重要。 +1 – 2012-03-29 18:05:13