Php 领域驱动设计:处理具有多种状态和关系的复杂实体(房地产)

Php 领域驱动设计:处理具有多种状态和关系的复杂实体(房地产),php,domain-driven-design,many-to-many,complexity-theory,Php,Domain Driven Design,Many To Many,Complexity Theory,因此,我对DDD还比较陌生,我正在尝试为我目前的雇主(房地产代理)建立一个可扩展且灵活的系统,这将帮助我们加快公司内部程序 如前所述,我们从事房地产业务。我试图定义我们的UL,但在概念化某些复杂实体时遇到了问题 例如:在房地产领域,“物业顾问”将访问潜在的“客户家”,并对其“物业”进行“评估”。上市后,该“评估”成为“上市”,也可以成为“出售财产”或“撤回财产”。“财产”可以在许多不同的状态下使用。我应该将“财产”定义为一个实体,还是应该将每个单独的州(评估、上市、出售、撤销)定义为一个单独的实

因此,我对DDD还比较陌生,我正在尝试为我目前的雇主(房地产代理)建立一个可扩展且灵活的系统,这将帮助我们加快公司内部程序

如前所述,我们从事房地产业务。我试图定义我们的UL,但在概念化某些复杂实体时遇到了问题

例如:在房地产领域,“物业顾问”将访问潜在的“客户家”,并对其“物业”进行“评估”。上市后,该“评估”成为“上市”,也可以成为“出售财产”或“撤回财产”。“财产”可以在许多不同的状态下使用。我应该将“财产”定义为一个实体,还是应该将每个单独的州(评估、上市、出售、撤销)定义为一个单独的实体

不过,当我们将“客户机”添加到组合中时,问题变得更加复杂。客户可以是“业主”、“买方”、“买方”、“坦能”、“投资者”、“开发商”等等。最重要的是,一个客户机可以是其中多个的组合!同样,“客户”是实体,所有这些状态都应表示为“客户”实体的属性,还是应表示为单独的实体

除此之外,“客户”实体与“财产”实体之间的关系如何。这是一种多对多的关系,我认为没有简单的方法将其结合起来。DDD似乎表明实体在其存在中应该是唯一的,因此这意味着我不能拥有一个包含附加“客户”实体列表的“属性”实体,而不使我的“客户”实体表现为VO。反之亦然,当考虑“客户”实体及其相关“财产”实体列表时


在过去的两周里,我每天都在读8个小时关于这个主题的书。这很令人困惑,我还没有解决这个问题。任何正确方向的帮助和指点都将不胜感激

首先,不要让自己太疯狂。面向对象编程通常被认为是一个好主意的原因之一是您可以尝试一些东西,然后随着您对问题领域的理解的增加而重构


对于您已经确定的具有各种“状态”的实体,请研究-在您的情况中,一个实体可以具有多个状态。确定哪些实体是聚合根-听起来像属性和客户机-并且由于复杂的关系,在单独的有界上下文中处理每个实体。然后我认为您的直觉是正确的,将局外人作为一个值对象传递到另一个对象的有界上下文中,以得到结果(很可能是通过一个服务对象) 我不做PHP,但我可以建议如何为类建模:


客户和角色
  • 创建一个接口(或抽象) 类)调用角色角色具有 返回到客户端的引用

  • 从中继承以下类 角色:所有者购买者购买者坦能投资者

  • 对于每个具体的角色类, 必要时延长构件(如坦能 可能有个月

  • 向您的客户添加角色列表。 每当新角色添加到 客户端。角色,角色应 推荐客户

  • 重要部分:您的大多数类都应该引用个人角色对象,而不是客户端。您可以通过角色访问客户端


    属性状态和转换
  • 创建名为PropertyEvent的接口(或抽象类)。 向它添加一个名为OccurredAt的时间戳属性

  • 从PropertyEvent继承以下类:评估上市出售撤销

  • 对于这些具体的PropertyEvent类,根据需要扩展构件(例如 评估将有一个关联的 评估)

  • 属性事件的列表添加到 财产。每当状态发生变化时, 创建适当的事件并添加 它是一个属性历史

  • 重要部分:这是域事件的概念。此技术将自动提供属性状态更改的历史记录


    请注意,我没有关注实体、聚合或值对象。当你对你的模型有了更好的感觉时,你可以计算出这些


    希望有帮助

    嘿,维杰,谢谢你的回复。我不知道你说“角色有一个对客户端的引用”和“每当一个新角色被添加到客户端。角色,角色应该引用客户端”是什么意思。另外,您如何以这种方式定义受限上下文中的角色?因为用户/员工也会使用角色。这就像说ClientRole和StaffRole一样简单。再次为奇怪的n00b问题道歉。我仍在努力理解核心概念。“重要的是:大多数类应该引用单个角色对象,而不是客户端。您可以通过角色访问客户端。”为什么要通过角色引用?这是否打破了客户机是聚合根并且应该是引用点的想法?