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) {}
}
具有属性DI
collection.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";

//...