繁体   English   中英

在Invertify中将具有属性注入的类绑定到内核

[英]Binding classes with property injection to kernel in inversify

我正在尝试通过inverseify对我的节点项目进行依赖注入。

我有一个这样的内核配置: 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

一类: config.ts

import {injectable} from "inversify";
@injectable()
export class Config {
  constructor() {}
}

具有属性DI collection.ts

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

inversify.config.ts导入行开始处理Collection.ts ,该行

import kernel from "../inversify.config";`

在里面。 但是,当我们到达Collection.ts时,我们已经在处理inversify.config.ts文件行

import kernel from "../inversify.config";`

以某种方式返回undefined使Collection类的内核undefined 因此, @lazyInject DI失败。

最终,当我尝试在Collection读取Config ,它失败并显示:

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的类的绑定, 而无需将内核定义与其中一个类移动到同一文件中。 我正在寻找一种可以立即导入内核的方法,但是可以使其正常工作。

您的问题是您具有循环依赖关系:

在此处输入图片说明

我将更改您的代码并添加几个其他文件。 虽然不需要types.ts文件,但建议将所有类型标识符都放在一个位置。

更改代码后,依赖关系图将更改为以下内容:

在此处输入图片说明

如您所知,我们已经消除了循环依赖。

inversify.config.ts

import "reflect-metadata";
import {Kernel, interfaces} from "inversify";
import getDecorators from "inversify-inject-decorators";
import { makeProvideDecorator } from "inversify-binding-decorators";

let kernel = new Kernel();
let {lazyInject} = getDecorators(kernel);
let provide = makeProvideDecorator(kernel);

export { lazyInject, provide };

类型

let TYPES = {
  Config: "Config",
  Collection: "Collection",
};

export default TYPES;

配置文件

import { provide } from "../inversify.config";
import TYPES from "./types";

@provide(TYPES.Config)
export class Config {
  constructor() {}
}

export default Config;

collection.ts

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;

主要

导入所有依赖项时,需要先导入它们,然后执行@provide并生成绑定。

import Config from "./lib/config";
import Collection from "./models/collection";

//...

我们已经能够使用inversify-binding-decorators中@provide装饰器消除循环依赖。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM