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

Soc*_*oos 9 php complexity-theory many-to-many domain-driven-design

所以我对DDD很新,我正在努力为我现在的雇主(房地产代理商)建立一个可扩展且灵活的系统,这将有助于我们加快公司内部程序的速度.

如上所述,我们在房地产.我正在尝试定义我们的UL,并且在构思某些复杂实体时遇到了问题.

例如:在房地产方面,"房地产顾问"将访问潜在的"客户家"并对其"房产"提供"评估".上市后,这个"评估"成为"上市",也可以成为"已售出房产"或"已撤回房产".有很多不同的州可以使用"财产".我是应该将"财产"定义为实体还是应将每个单独的州(评估,上市,出售,撤回)定义为单独的实体?

当我们将"客户"添加到组合中时,问题变得更加复杂.客户可以是"业主","购买者","买方","Tennant","投资者","开发者"以及许多其他人.最重要的是,客户可以是多个客户的组合!同样,"客户"应该是实体,所有这些状态只是作为"客户"实体的属性来表示,还是应该是独立的实体?

最重要的是,"客户"实体与"财产"实体的关系如何.它是一个多对多的关系,我认为没有简单的方法来组合它.DDD似乎表明实体在其存在时应该是唯一的,因此意味着我不能拥有带有附加"客户"实体列表的"财产"实体,而不会使我的"客户"实体表现得像VO.反之亦然,在考虑"客户"实体时,列出其相关的"财产"实体.

关于这个问题,过去两周我一直在阅读8小时.它非常混乱,我还没有解决这个烂摊子.任何有关正确方向的帮助和指示都将不胜感激!

Vij*_*tel 4

我不会使用 PHP,但我可以建议如何对您的类进行建模:


客户和角色

  1. 创建一个名为Role 的接口(或抽象类)。 角色具有对客户端的引用

  2. 从 Role 继承以下类: OwnerBuyerBuyerTennantInvestor

  3. 对于每个具体角色类,根据需要扩展成员(例如 Tennant 可能有MonthlyRent

  4. 将角色列表添加到您的客户端。每当将新角色添加到 Client.Roles时,该角色应引用 Client

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


属性状态和转换

  1. 创建一个名为PropertyEvent的接口(或抽象类)。向其中添加一个名为OccurredAt的时间戳属性。

  2. 从 PropertyEvent 继承以下类:AppraisalListingSoldWithdrawn

  3. 对于每个具体的 PropertyEvent 类,根据需要扩展成员(例如,Appraisal 将具有关联的 AppraisedBy?)

  4. 将PropertyEvents列表添加到您的 Property。每当状态发生变化时,创建适当的事件并将其添加到Propery.History中。

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


请注意,我没有关注实体、聚合或值对象。当您对模型有更好的感觉时,您可以解决这些问题。

希望有帮助!