避免在域模型中使用循环引用

ng5*_*000 7 .net c# design-patterns domain-driven-design

这必须是一个常见的情况,已经有很多关于它的文章,希望甚至是一个非常好的模式.我有一个域模型,其中自定义容器包含实体.例如(为简洁而排除的属性和接口):

class Entity
{
    public int Id;
    public EntityContainer ParentContainer;
}


class EntityContainer
{
    public int Id;
    public IList<Entity> Entities = new List<Entity>();

    public void AddEntity(Entity entity)
    {
        entity.ParentContainer = this;
        Entities.Add(entity);
    }
}


class Main
{
    public Main()
    {
        Entity entity1 = new Entity();
        Entity entity2 = new Entity();
        EntityContainer entityContainer = new EntityContainer();
        entityContainer.AddEntity(entity1);
        entityContainer.AddEntity(entity2);

        // Can now traverse graph easily, e.g.
        Console.WriteLine("entity1's parent container ID = " + entity1.ParentContainer.Id);
        Console.WriteLine("Container contains at least this entity ID: " + entityContainer.Entities[0].Id);

    }
}
Run Code Online (Sandbox Code Playgroud)

我现在可以通过两种方式轻松遍历我的对象图,但创建了一个循环引用.你会创建第三种类型来离婚依赖吗?

提前致谢

Pat*_*ald 5

循环引用本身并没有什么问题,它们在.NET Framework 中被广泛使用,例如XmlNode.OwnerDocument、Control.Parent。

如果您需要遍历树,那么可以使用反向引用。

在 COM 中,循环引用很棘手,因为如果您将容器及其所有子级设置为空,则对象将无法正确清理,因为子级仍然保留对父级的引用。然而,.NET 垃圾收集的实现方式没有问题。