跳至正文
Wener Notes

inversify

约 1 分钟阅读
  • 推荐使用 Symbol - 也可以使用 Class/string 作为 Token
TypeScript
const TYPES = {
  ServiceFoo: Symbol.for('ServiceFoo'),
  ServiceConf: Symbol.for('ServiceConf'),
  ServiceBar: Symbol.for('ServiceBar'),
};

@injectable()
class ServiceBar implements IServiceBar {
  private _conf: any;
  @inject(TYPES.ServiceFoo) private _foo: IServiceFoo;
  public constructor(@inject(TYPES.ServiceConf) conf: any) {
    this._conf = conf;
  }
}

//
const container = new Container();
container.bind<IServiceBar>(TYPES.ServiceBar).to(ServiceBar);
//
const bar = container.get<IServiceBar>(TYPES.ServiceBar);
// 级联
let childContainer = new Container();
childContainer.parent = parentContainer;

// 外部 Class 可手动修饰
import { decorate, injectable } from 'inversify';
decorate(injectable(), SomeClass);

核心概念

  • ContainerModule
  • AsyncContainerModule
TypeScript
// 模块
let warriors = new ContainerModule((bind: interfaces.Bind, unbind: interfaces.Unbind) => {
  bind<Ninja>('Ninja').to(Ninja);
});
// 异步 load
let warriors = new AsyncContainerModule(async (bind: interfaces.Bind, unbind: interfaces.Unbind) => {
  const ninja = await getNinja();
  bind<Ninja>('Ninja').toConstantValue(ninja);
});

container.load(warriors); // 加载
await container.loadAsync(warriors, weapons); // 加载异步
container.unload(warriors); // 卸载

Typed Token

collocate service identifier and type

TypeScript
export interface IFoo {}
export namespace IFoo {
  export const $: interfaces.ServiceIdentifier<IFoo> = Symbol('IFoo');
}

class MyService {
  @inject(IFoo.$)
  private readonly foo!: IFoo;

  constructor(@inject(IFoo.$) foo: IFoo) {}
}

关联信息

反向链接、本文链接的其他页面和外部资料。

参考资料

GitHub3 条
最近更新commit 359377d编辑