import "reflect-metadata"; import {Container, ContainerModule, decorate, injectable, interfaces} from 'inversify'; export class Kernel { private container = new Container(); public singleton(classes: interfaces.Newable[]) { classes.forEach((clazz) => { this.container.bind(clazz).toSelf().inSingletonScope(); }); } public bindSingleton(serviceIdentifier: interfaces.ServiceIdentifier, clazz: interfaces.Newable) { this.container.bind(serviceIdentifier).to(clazz).inSingletonScope(); }; bind(serviceIdentifier: interfaces.ServiceIdentifier): interfaces.BindingToSyntax { return this.container.bind(serviceIdentifier); } load(...modules: ContainerModule[]) { this.container.load(...modules); } public getContainer() { return this.container; } public setParent(kernel: Kernel) { this.container.parent = kernel.container; } static decorate(clazz: any) { if (!Reflect.hasOwnMetadata('inversify:paramtypes', clazz)) { decorate(injectable(), clazz); } } resolve(constructorFunction: interfaces.Newable): T { return this.container.resolve(constructorFunction); } }