首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >InversifyJS注入文字构造器参数

InversifyJS注入文字构造器参数
EN

Stack Overflow用户
提问于 2016-05-25 14:13:40
回答 1查看 6.7K关注 0票数 7

是否可以在InversifyJS中获得以下行为:

代码语言:javascript
复制
constructor(IDependency resolvedDependency, string myLiteral)
                        ^                          ^
                Automatically resolve      Defined Literal

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-26 11:37:51

有几件事你可以做。我会在这里发几个..。

将文字注入为常量值

代码语言:javascript
复制
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");

根据上下文注入文字

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

代码语言:javascript
复制
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");

注射工厂

代码语言:javascript
复制
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");

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

代码语言:javascript
复制
@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));
    }
}

我认为最好的解决办法是使用工厂。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37439798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档