如何在只使用一次循环引用的层次结构中加载实例

本文关键字:引用 循环 一次 层次结构 实例 加载 | 更新日期: 2023-09-27 17:50:22

我有一个这样的对象结构:

public class Entity
{
    IList<Relationship> Relationships{get;set;}
}
public class Relationship
{
    public Relationship(Entity parent, IList<Entity> children)
    {
    //set properties
    }
    Entity Parent{get;private set;}
    IList<Entity> Children{get;private set;}
}

Relationship包含父实例和子实例的所有信息,我想在父实例和构成关系的所有子实例上共享相同的Relationship实例。

现在,当我从数据库加载实体时,我从顶部实体开始,然后加载关系。我认为我可以缓存我正在构建的关系,并为子节点重用相同的实例。但这并不适用于创建一个关系,我需要加载所有子实体,所以每个子实体试图重新创建相同的关系,我目前试图得到的孩子之前,它已被创建,所以我最终创建所有的关系实例在我下面的树在我可以将关系添加到缓存。

是否有一种方法可以绕过这个问题,而不使子节点成为关系的可设置属性,这样我就可以在创建子节点之前创建对关系的引用?

如何在只使用一次循环引用的层次结构中加载实例

所以我通过引入一个RelationshipBuilder类来管理这一点,我用它来跟踪关系的父母和孩子,而不实际创建它。

这使我能够加载一个实体并在构建器中创建它的关系,当关系试图创建子关系时,它们会与构建器检查关系是否已经创建并返回。

这意味着我可以在层次结构中导航,加载所有实体实例并设置与关系相关的父实体和子实体。一旦所有实体都加载完成,递归完成,我们返回到开始加载实体的入口点,我要求关系构建器解决所有关系。然后,这将创建它已被告知的每个关系,并在该关系中涉及的父实例和子实例上设置关系实例。