gpt4 book ai didi

typescript - InversifyJS 注入(inject)文字构造函数参数

转载 作者:搜寻专家 更新时间:2023-10-30 21:24:41 24 4
gpt4 key购买 nike

是否可以使用 InversifyJS 获得以下行为:

constructor(IDependency resolvedDependency, string myLiteral)
^ ^
Automatically resolve Defined Literal

如果是这样,最好的方法是什么?

最佳答案

您可以做一些事情。在这里我将发布其中的一些...

将文字作为常量值注入(inject)

let TYPES = {
IWarrior: Symbol("IWarrior"),
IWeapon: Symbol("IWeapon"),
rank: Symbol("rank")
}

interface IWeapon {}

@injectable()
class Katana implements IWeapon {}

interface IWarrior {
weapon: IWeapon;
rank: string;
}

@injectable()
class Warrior implements IWarrior {
public weapon: IWeapon;
public rank: string;
public constructor(
@inject(TYPES.IWeapon) weapon: IWeapon,
@inject(TYPES.rank) rank: string
) {
this.weapon = weapon;
this.rank = rank;
}
}

let kernel = new Kernel();
kernel.bind<IWarrior>(TYPES.IWarrior).to(Warrior);
kernel.bind<IWeapon>(TYPES.IWeapon).to(Katana);
kernel.bind<string>(TYPES.rank).toConstantValue("master");

根据上下文注入(inject)文字

使用上下文约束,您可以为特定上下文注入(inject)常量值:

let kernel = new Kernel();
kernel.bind<IWarrior>(TYPES.IWarrior).to(Warrior);
kernel.bind<IWeapon>(TYPES.IWeapon).to(Katana);

kernel.bind<string>(TYPES.rank)
.toConstantValue("master")
.whenTargetTagged("rank", "master");

kernel.bind<string>(TYPES.rank)
.toConstantValue("student")
.whenTargetTagged("rank", "student");

let master = kernel.getTagged(TYPES.IWarrior, "rank", "master");
let student = kernel.getTagged(TYPES.IWarrior, "rank", "student");

注入(inject)工厂

let TYPES = {
IWarrior: Symbol("IWarrior"),
IWeapon: Symbol("IWeapon"),
IFactoryOfIWarrior: Symbol("IFactory<IWarrior>")
}

interface IWeapon {}

@injectable()
class Katana implements IWeapon {}

interface IWarrior {
weapon: IWeapon;
rank: string;
}

@injectable()
class Warrior implements IWarrior {
public weapon: IWeapon;
public rank: string;
public constructor(
@inject(TYPES.IWeapon) weapon: IWeapon
) {
this.weapon = weapon;
this.rank = null; // important!
}
}

let kernel = new Kernel();
kernel.bind<IWarrior>(TYPES.IWarrior).to(Warrior);
kernel.bind<IWeapon>(TYPES.IWeapon).to(Katana);

kernel.bind<inversify.IFactory<IWarrior>>(TYPES.IFactoryOfIWarrior)
.toFactory<IWarrior>((context) => {
return (rank: string) => {
let warrior = context.kernel.get<IWarrior>(TYPES.IWarrior);
warrior.rank = rank;
return warrior;
};
});

let warriorFactory = kernel.get<inversify.IFactory<IWarrior>>(TYPES.IFactoryOfIWarrior);

let master = warriorFactory("master");
let student = warriorFactory("student");

您可以将工厂注入(inject)其他类:

@injectable()
class Army {
private _warriorFactory: (rank: string) => IWarrior;
private _soldiers: IWarrior[];
public constructor(
@inject(TYPES.IFactoryOfIWarrior) warriorFactory: (rank: string) => IWarrior
) {
this._warriorFactory = warriorFactory;
this._soldiers = [];
}
public newRecruit(rank: string) {
this._soldiers.push(this._warriorFactory(rank));
}
}

我认为最好的解决方案是使用工厂。

关于typescript - InversifyJS 注入(inject)文字构造函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37439798/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com