Typescript 在inversify中将具有属性注入的类绑定到内核
我试图通过在我的节点项目上实现依赖注入 我有这样一个内核配置:Typescript 在inversify中将具有属性注入的类绑定到内核,typescript,dependency-injection,inversifyjs,Typescript,Dependency Injection,Inversifyjs,我试图通过在我的节点项目上实现依赖注入 我有这样一个内核配置:inversify.config.ts import "reflect-metadata"; import {Kernel, interfaces} from "inversify"; import {Config} from "./config"; import {Collection} from "./collection"; let kernel = new Kernel(); kernel.bind<Config&
inversify.config.ts
import "reflect-metadata";
import {Kernel, interfaces} from "inversify";
import {Config} from "./config";
import {Collection} from "./collection";
let kernel = new Kernel();
kernel.bind<Config>("Config").to(Config).inSingletonScope();
// kernel.bind<interfaces.Newable<Collection>>("Collection").toConstructor<Collection>(Collection);
// it works without the line above
import {injectable} from "inversify";
@injectable()
export class Config {
constructor() {}
}
import {injectable} from "inversify";
import getDecorators from "inversify-inject-decorators";
import kernel from "../inversify.config";
let {lazyInject} = getDecorators(kernel);
@injectable()
export class Collection {
@lazyInject(Config)
private Config: Config;
constructor(a: string, b: string) {}
}
具有属性DIcollection.ts的类
import "reflect-metadata";
import {Kernel, interfaces} from "inversify";
import {Config} from "./config";
import {Collection} from "./collection";
let kernel = new Kernel();
kernel.bind<Config>("Config").to(Config).inSingletonScope();
// kernel.bind<interfaces.Newable<Collection>>("Collection").toConstructor<Collection>(Collection);
// it works without the line above
import {injectable} from "inversify";
@injectable()
export class Config {
constructor() {}
}
import {injectable} from "inversify";
import getDecorators from "inversify-inject-decorators";
import kernel from "../inversify.config";
let {lazyInject} = getDecorators(kernel);
@injectable()
export class Collection {
@lazyInject(Config)
private Config: Config;
constructor(a: string, b: string) {}
}
如果我不使用属性注入绑定一个类,那么一切都会正常工作。当我尝试用@lazyInject
绑定一个类时,如示例所示
kernel.bind<interfaces.Newable<Collection>>("Collection").toConstructor<Collection>(Collection);
在里面。然而,当我们到达Collection.ts
时,我们已经在处理inversify.config.ts
文件行
import kernel from "../inversify.config";`
以某种方式返回undefined
使集合类的内核undefined
。因此,@lazyInject
DI失败
最终,当我尝试在集合
中读取配置
时,它失败了,原因是:
TypeError: Cannot read property 'get' of undefined
at resolve (node_modules/inversify-inject-decorators/lib/decorators.js:24:30)
at Category.getter (node_modules/inversify-inject-decorators/lib/decorators.js:6:47)
我想知道是否有一种方法可以通过@lazyInject
实现类与属性DI的绑定,而不必将内核定义移动到与其中一个类相同的文件中。我正在寻找一种方法,可以像现在这样导入内核,但要使其正常工作。您的问题是您有一个循环依赖关系:
我将更改您的代码并添加几个附加文件。不需要he文件types.ts
,但建议将所有类型标识符保存在一个位置
更改代码后,依赖关系图将更改为以下内容:
正如您所看到的,我们已经消除了循环依赖
inversify.config.ts
类型.ts
config.ts
收藏
梅因酒店
您需要在导入所有依赖项时导入这些依赖项@provide,然后生成绑定
import Config from "./lib/config";
import Collection from "./models/collection";
//...
我们已经能够使用中的@provide
装饰器消除循环依赖性。我在没有为标识符执行“导出默认值”时遇到问题,因为这样类型将未定义。我不明白为什么它只适用于“默认”导出?这与元数据生成有关吗?
import { lazyInject, provide } from "../inversify.config";
@provide(TYPES.Collection)
export class Collection {
@lazyInject(TYPES.Config)
private Config: Config;
constructor(a: string, b: string) {}
}
export default Collection;
import Config from "./lib/config";
import Collection from "./models/collection";
//...