- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试通过 inversify 在我的节点项目上实现依赖注入(inject).
我有一个这样的内核配置: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类: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) {}
}
如果我不使用属性注入(inject)绑定(bind)类,一切都会按预期工作。当我尝试用 @lazyInject
绑定(bind)一个类时如示例所示
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
制作内核undefined
对于 Collection
类(class)。因此@lazyInject
DI 失败。
最终当我尝试阅读Config
时在Collection
它失败了:
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 绑定(bind)无需将内核定义移动到与其中一个类相同的文件中。我正在寻找一种方法来导入内核,但使其正常工作。
最佳答案
你的问题是你有循环依赖:
我将更改您的代码并添加几个附加文件。不过,不需要 types.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;
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 时导入所有依赖项,然后生成绑定(bind)。
import Config from "./lib/config";
import Collection from "./models/collection";
//...
我们已经能够使用inversify-binding-decorators中的@provide
装饰器消除循环依赖。 .
关于typescript - 在 inversify 中将具有属性注入(inject)的类绑定(bind)到内核,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38927236/
你能比较一下属性吗 我想禁用文本框“txtName”。有两种方式 使用javascript,txtName.disabled = true 使用 ASP.NET, 哪种方法更好,为什么? 最佳答案 我
Count 属性 返回一个集合或 Dictionary 对象包含的项目数。只读。 object.Count object 可以是“应用于”列表中列出的任何集合或对
CompareMode 属性 设置并返回在 Dictionary 对象中比较字符串关键字的比较模式。 object.CompareMode[ = compare] 参数
Column 属性 只读属性,返回 TextStream 文件中当前字符位置的列号。 object.Column object 通常是 TextStream 对象的名称。
AvailableSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。 object.AvailableSpace object 应为 Drive 
Attributes 属性 设置或返回文件或文件夹的属性。可读写或只读(与属性有关)。 object.Attributes [= newattributes] 参数 object
AtEndOfStream 属性 如果文件指针位于 TextStream 文件末,则返回 True;否则如果不为只读则返回 False。 object.A
AtEndOfLine 属性 TextStream 文件中,如果文件指针指向行末标记,就返回 True;否则如果不是只读则返回 False。 object.AtEn
RootFolder 属性 返回一个 Folder 对象,表示指定驱动器的根文件夹。只读。 object.RootFolder object 应为 Dr
Path 属性 返回指定文件、文件夹或驱动器的路径。 object.Path object 应为 File、Folder 或 Drive 对象的名称。 说明 对于驱动器,路径不包含根目录。
ParentFolder 属性 返回指定文件或文件夹的父文件夹。只读。 object.ParentFolder object 应为 File 或 Folder 对象的名称。 说明 以下代码
Name 属性 设置或返回指定的文件或文件夹的名称。可读写。 object.Name [= newname] 参数 object 必选项。应为 File 或&
Line 属性 只读属性,返回 TextStream 文件中的当前行号。 object.Line object 通常是 TextStream 对象的名称。 说明 文件刚
Key 属性 在 Dictionary 对象中设置 key。 object.Key(key) = newkey 参数 object 必选项。通常是 Dictionary 
Item 属性 设置或返回 Dictionary 对象中指定的 key 对应的 item,或返回集合中基于指定的 key 的&
IsRootFolder 属性 如果指定的文件夹是根文件夹,返回 True;否则返回 False。 object.IsRootFolder object 应为&n
IsReady 属性 如果指定的驱动器就绪,返回 True;否则返回 False。 object.IsReady object 应为 Drive&nbs
FreeSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。只读。 object.FreeSpace object 应为 Drive 对象的名称。
FileSystem 属性 返回指定的驱动器使用的文件系统的类型。 object.FileSystem object 应为 Drive 对象的名称。 说明 可
Files 属性 返回由指定文件夹中所有 File 对象(包括隐藏文件和系统文件)组成的 Files 集合。 object.Files object&n
我是一名优秀的程序员,十分优秀!