针对Java / Typescript中循环依赖问题的美丽解决方案

问题描述 投票:1回答:1

[在构建我正在从事的项目时,我偶然发现了循环依赖问题:一个小的ORM,用于学习。

重现问题的最小项目可以找到here。这里是一个更简单的概述:

文章

import { ManyToMany } from './ManyToMany';
import { Tag } from './Tag';

export class Article {
    @ManyToMany(Tag)
    tags: Tag[] = [];
}

ManyToMany

//no imports
export function ManyToMany(entity) {
    …
}

标签

import { ManyToMany } from './ManyToMany';
import { Article } from './Article';

export class Tag {
    @ManyToMany(Article)
    articles: Article[] = [];
}

重要的是,不要对代码进行太多更改或根本不要更改,因为这会影响DX。我不希望该库的用户创建其他黑客文件来解决此问题。

我找到了一个讨论列表,但没有一个是优雅的:

我能找到的最佳解决方案是使用内部模块模式。此解决方案和所有其他解决方案只是解决该问题的方法和变通办法,实际上没有一个解决方案。

是否有一个更好,更优雅的解决方案,而无需创建其他文件或移动代码?

javascript typescript decorator circular-dependency typescript-decorator
1个回答
0
投票

根据Bergi的评论,可行的解决方案是使引用变得惰性,即传递一个返回实体的函数,而不是立即对它进行评估(在属性修饰期间),但是稍后在加载所有模块时,将初始化类,并且创建了第一个实例。

我已经尝试在此处实现相同的https://stackblitz.com/edit/typescript-f5rm9u。请检查执行情况。

文章:

import { ManyToMany } from './ManyToMany';
import { Tag } from './Tag';

export class Article {
    @ManyToMany( Tag => Tag)
    tags: Tag[] = [];
}

标签

import { ManyToMany } from './ManyToMany';
import { Article } from './Article';

export class Tag {
    @ManyToMany(Article => Article)
    articles: Article[] = [];
}

答案信用:@Bergi

© www.soinside.com 2019 - 2024. All rights reserved.