gpt4 book ai didi

node.js - Typescript/NodeJS - 与工厂合作时的循环依赖

转载 作者:太空宇宙 更新时间:2023-11-04 00:22:17 25 4
gpt4 key购买 nike

我对 Typescript 和 NodeJS 很陌生,我正在尝试使用工厂在运行时创建对象。

作为示例,以下对象具有属性类型 Text,现在在运行时获取该属性,我想创建 TextContainer 的实例:

{
type: "Text",
name: "Title"
}

我的工厂是这样的:

import {BaseContainer} from "../Containers/BaseContainer";
import {TextContainer} from "../Containers/TextContainer";
/**
* Used to dynamically create objects with different container classes
* in runtime
*/
export class ContainerFactory {

// Object containing all class names and types
private dictionary: Object;

/**
* Initializes factory dictionary
*/
constructor() {
// Initialize dictionary with classes
this.dictionary = {
"default": BaseContainer,
"Text": TextContainer,
"TextContainer": TextContainer
}
}

/**
* Builds object depending on className
* @param className
* @param params
*/
build(className: string, params: Object) {
// Return new class of type className, if not found
// return object with class of set default class
return className in this.dictionary ? new this.dictionary[className](params) : new this.dictionary['default'];

}
}

当在 BaseContainer 类(由 TextContainer 扩展,并将由该工厂中存在的更多类扩展)中我在函数中使用工厂时,问题就出现了,这里出现了循环依赖,因为在 BaseContainer 中我导入了 ContainerFactory,而在 ContainerFactory 中则导入了 BaseContainer。

我需要 BaseContainer 中的工厂,因为我有一个树状层次结构,并且容器有子容器,它们本身就是容器。

我很感激有关如何解决此问题或如何重构我的代码以使其可靠工作的建议。我搜索了类似的问题,但尚未找到解决方法。

我在 TextContainer 类(扩展 BaseContainer)中收到以下错误:

extendStatics(d, b);
^

TypeError: Object prototype may only be an Object or null: undefined

最佳答案

此任务的更好解决方案是使用装饰器将类型名称映射到相应的构造函数。例如:

装饰器.ts:

export function Container(className: string)
{
return (target: any) =>
{
Meta.classNameToCtor[!!className ? className : target.name] = target;
};
}

元.ts:

export class Meta
{
public static classNameToCtor: {[key: string]: any} = {};
}

现在您需要做的就是像这样装饰每个容器类:

@Container("default")
export class BaseContainer {...}

并在你的工厂中通过Meta访问构造函数:

build(className: string, params: Object) 
{
return className in Meta.classNameToCtor ? new Meta.classNameToCtor[className](params) : new Meta.classNameToCtor['default'];
}

这种方法完全消除了导入依赖关系,并且使用起来更具可扩展性/优雅性。

关于node.js - Typescript/NodeJS - 与工厂合作时的循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44134469/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com