将 类 与 属性 注入 inversify 中的内核绑定
Binding classes with property injection to kernel in inversify
我正在尝试通过 inversify 在我的节点项目上实现依赖注入。
我有这样的内核配置: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
A class: config.ts
import {injectable} from "inversify";
@injectable()
export class Config {
constructor() {}
}
A class 与 属性 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) {}
}
如果我不将 class 与 属性 注入绑定,一切都会按预期工作。当我尝试将 class 与 @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";`
不知何故 returns undefined
为 Collection
class 制作内核 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
将 class 与 属性 DI 绑定到 class 而无需将内核定义移动到与 class 之一相同的文件。我正在寻找一种方法来 导入 内核,但要使其正常工作。
你的问题是你有一个循环依赖:
我将更改您的代码并添加几个附加文件。尽管不需要文件 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 };
types.ts
let TYPES = {
Config: "Config",
Collection: "Collection",
};
export default TYPES;
config.ts
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;
main.ts
您需要在导入时导入所有依赖项@provide 被执行,然后生成绑定。
import Config from "./lib/config";
import Collection from "./models/collection";
//...
我们已经能够使用 inversify-binding-decorators 中的 @provide
装饰器消除循环依赖。
我正在尝试通过 inversify 在我的节点项目上实现依赖注入。
我有这样的内核配置: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
A class: config.ts
import {injectable} from "inversify";
@injectable()
export class Config {
constructor() {}
}
A class 与 属性 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) {}
}
如果我不将 class 与 属性 注入绑定,一切都会按预期工作。当我尝试将 class 与 @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";`
不知何故 returns undefined
为 Collection
class 制作内核 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
将 class 与 属性 DI 绑定到 class 而无需将内核定义移动到与 class 之一相同的文件。我正在寻找一种方法来 导入 内核,但要使其正常工作。
你的问题是你有一个循环依赖:
我将更改您的代码并添加几个附加文件。尽管不需要文件 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 };
types.ts
let TYPES = {
Config: "Config",
Collection: "Collection",
};
export default TYPES;
config.ts
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;
main.ts
您需要在导入时导入所有依赖项@provide 被执行,然后生成绑定。
import Config from "./lib/config";
import Collection from "./models/collection";
//...
我们已经能够使用 inversify-binding-decorators 中的 @provide
装饰器消除循环依赖。