代码之家  ›  专栏  ›  技术社区  ›  ng5000

在域驱动设计中,当一个实体克隆自己时,是谁将其添加到其容器中的?

  •  5
  • ng5000  · 技术社区  · 17 年前

    Body类只是Cell的集合,例如。

    class Body
    {
        IList<Cell> cells;
        public void AddCell(Cell c) { ... }
        public void RemoveCell(Cell c) { ... }
    }
    

    Class Cell
    {
        public Cell Split()
        {
            Cell newCell = new Cell();
            // Copy this cell's properties into the new cell.
            return Cell;
        }
    }
    

    1. 该单元格将新创建的单元格添加到Body中(这意味着每个cell对象都包含对其包含的主体的引用)?
    2. 或者,收到初始用户请求的服务层应该调用Split,收集返回的Cell并将其添加到Body中吗?(使用控制器而不是域对象感觉更贫血的设计)

    5 回复  |  直到 17 年前
        1
  •  2
  •   G Fernandes    17 年前

    我认为Body会简单地调用Cell上的splitCell()。然后,身体可以用新的细胞做它想做的事情——添加、消耗、丢弃,无论什么。无论如何,身体都包含着细胞。

        2
  •  2
  •   G Fernandes    17 年前

        3
  •  1
  •   Romain Verdier    17 年前

    在DDD中,它通常取决于域。在这里,这个例子——以及域名——似乎有点奇怪,但我想我会选择一个 SplitCell 方法on Body .

    虽然我不太清楚细胞分裂意味着什么,以及什么应该触发这一动作,但我想身体负责分裂细胞。我会更舒服 Regenerate 方法,或类似的东西,在 身体 ,通过调用 Split

    好吧,这个例子确实很奇怪。..

        4
  •  1
  •   Vijay Patel    17 年前

    在上使用事件 Cell 类似乎是一个自然的解决方案,但在C#中实现起来更棘手。

    Cells 进入作用域后,当它们超出作用域时,您还需要解除它们的锁定,否则会出现内存泄漏。

    Body 即,当从持久性存储中检索到细胞时。使用容器来管理关系(可能是ORM拦截器)可以使这更容易。

    更简单的替代方案是保留对父级的引用 身体 (单元格只属于一个 身体 正确的),让新 细胞 将自己添加到它的 身体 .

    • 优点:易于编码、调试和理解。
    • 缺点:细胞和身体变得紧密耦合,使它们在其他环境中更难重复使用(这可能无关紧要)
        5
  •  0
  •   ng5000    17 年前