Как загрузить экземпляры в иерархии с циклическими ссылками только один раз? - PullRequest
1 голос
/ 14 апреля 2011

У меня есть объектная структура, подобная этой:

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 на родительском и всех дочерних экземплярах, которыесоздайте отношения.

Теперь, когда я загружаю свои сущности из БД, я начинаю с верхней сущности, которая затем загружает связи.Я думал, что смогу просто кешировать отношения, которые я строю, и использовать один и тот же экземпляр для детей.Но это не работает для создания отношений, которые мне нужны для загрузки всех дочерних сущностей, поэтому каждая дочерняя сущность пытается воссоздать те же отношения, которые я сейчас пытаюсь получить до того, как они были созданы, поэтому я в итоге создаю всеэкземпляров отношений ниже меня в дереве, прежде чем я смогу добавить отношение в кеш.

Есть ли способ обойти это, не делая потомков настраиваемым свойством моих отношений, чтобы я мог создатьссылка на отношения до создания детей?

1 Ответ

0 голосов
/ 20 апреля 2011

Итак, я справился с этим, представив класс RelationshipBuilder, который я использовал для отслеживания родителей и детей в отношениях без фактического их создания.

Это позволило мне загрузить сущность и создать ее отношения в компоновщике, когда отношения пытались создать дочерние элементы, которые они проверили с помощью компоновщика, чтобы убедиться, что связь уже создается и возвращается.

Это означало, что я мог пройти весь путь вниз по иерархии, загружая все экземпляры сущности и устанавливая родительскую сущность и дочерние сущности, связанные с отношениями. Когда все сущности были загружены и рекурсия завершена, и мы были возвращены к точке входа, где мы начали загружать сущности, я прошу построителя отношений разрешить все отношения. Затем создается каждое отношение, о котором он был проинформирован, и устанавливается экземпляр отношения для родительского и дочернего экземпляров, которые участвуют в этих отношениях.

...