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

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

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

    例如,我们有两个领域对象:细胞和身体(如人类的细胞和身体)。

    body类只是一组细胞,例如

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

    单元有一个split方法,该方法在内部创建自身的克隆,例如

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

    现在,在DDD中,当单元格拆分时应该:

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

    事先谢谢。

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

    我认为主体只会在单元上调用splitcell()。然后身体可以用新的细胞做它想做的事情——增加自身,消耗它,扔掉它,不管什么。不管怎样,主体包含了这个单元。

        2
  •  2
  •   G Fernandes    16 年前

    好的-另一种方法是向身体发送一个事件,说“我要分裂”或其他什么。然后身体就可以接收到新的细胞——也许是这个事件的有效载荷。

    如果外部参与者不知道主体,split方法是否需要返回新的细胞克隆?外部演员会用这个吗?或者split方法不能返回任何东西(void)并简单地向它所居住的身体发送消息吗?

        3
  •  1
  •   Romain Verdier    16 年前

    在DDD中,它通常依赖于域。在这里,这个例子——以及这个领域——看起来有点奇怪,但我想我会选择一个 SplitCell 方法对 Body .

    虽然我不太清楚细胞分裂是什么意思,也不清楚是什么触发了这个动作,但我猜是身体导致了细胞分裂。我会更舒服的 Regenerate 方法或类似的方法 身体 ,通过调用 Split 方法。

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

        4
  •  1
  •   Vijay Patel    16 年前

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

    Cells 进入作用域,当它们超出作用域时,您还需要将它们解开——否则您将得到内存泄漏。

    每当单元格与 Body ,即从持久性存储中检索单元时。使用一个容器来管理关系(可能是一个ORM拦截器)可以使这变得更容易。

    更简单的选择是保存对父级的引用 身体 (单元格只属于单个 身体 对吧?)让新的 细胞 添加到它的 身体 .

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

    在阅读了领域驱动设计(Evans)之后,似乎最好使用 service .