whenTargetIsDefault
当一个给定的服务识别器存在多个绑定可用时,我们可以使用如下特性来解决潜在的 模糊匹配
异常:
在这一节我们来解释如何使用默认目标:
我们可以使用一个命名限制来解决 模糊匹配
异常:
container.bind<Weapon>("Weapon").to(Katana).whenTargetNamed("strong");
container.bind<Weapon>("Weapon").to(Shuriken).whenTargetNamed("weak");
或者一个标签限制:
container.bind<Weapon>("Weapon").to(Katana).whenTargetTagged("strong", true);
container.bind<Weapon>("Weapon").to(Shuriken).whenTargetTagged("strong", false);
这种解决方案的问题是我们不得不在每一次地注入时使用 @named("strong")
/@named("weak")
或者 @tagged("strong", true)
/@tagged("strong", false)
来标记。
更好的方案是使用默认目标:
container.bind<Weapon>(TYPES.Weapon).to(Shuriken).whenTargetNamed(TAG.throwable);
container.bind<Weapon>(TYPES.Weapon).to(Katana).whenTargetIsDefault();
当没有 @named
或者 @tagged
标记可用时,我们可以使用 whenTargetIsDefault
来指示哪个绑定应该被用作默认,从而解决 模糊匹配
异常。
let TYPES = {
Weapon: "Weapon"
};
let TAG = {
throwable: "throwable"
};
interface Weapon {
name: string;
}
@injectable()
class Katana implements Weapon {
public name: string;
public constructor() {
this.name = "Katana";
}
}
@injectable()
class Shuriken implements Weapon {
public name: string;
public constructor() {
this.name = "Shuriken";
}
}
let container = new Container();
container.bind<Weapon>(TYPES.Weapon).to(Shuriken).whenTargetNamed(TAG.throwable);
container.bind<Weapon>(TYPES.Weapon).to(Katana).whenTargetIsDefault();
let defaultWeapon = container.get<Weapon>(TYPES.Weapon);
let throwableWeapon = container.getNamed<Weapon>(TYPES.Weapon, TAG.throwable);
expect(defaultWeapon.name).eql("Katana");
expect(throwableWeapon.name).eql("Shuriken");