2016-05-25 3 views

ответ

2

Есть несколько вещей, которые вы можете сделать. Здесь я буду размещать некоторые из них ...

подающая буквальные как постоянное значение

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"); 

Инъекционного буквальные на основе контекста

Использования контекстных ограничений можно вводить постоянное значение для конкретный контекст:

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"); 

инъекционного завод

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"); 

Вы можете вводить заводы в другие классы:

@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)); 
    } 
} 

Я думаю, что лучшим решением является использование завод.

Смежные вопросы