实体如何在域内相互连接?

时间:2013-03-18 13:03:06

标签: domain-driven-design

假设有两个域实体:

  • UserImages ,方法为 addNewImage() removeImage $ imageId ), getImages $ from,$ count )。
  • UserProfile ,字段名称年龄 mainImageId

域内需要以下功能:当应用层调用 UserImages - > addNewImage() UserProfile - >如果它是空的,则会自动设置 mainImageId

那么,实现域内过度实体业务逻辑的最佳方式和最佳位置是什么?具有观察服务的域事件,引用来自实体的特殊服务,或者其他什么?

我使用某种工厂创建所有实体,即

$userImages = Domain::userImages($userId); // getting an instance of UserImages
$newImageId = $userImages -> addNewImage();   // adding a new image

我还应该提一下,我的项目中会有很多逻辑,如上所述。

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

对我来说,用户听起来像聚合(很难在没有上下文的情况下给你一个意见:)),但它可以解决你的问题。

如果Profil和Images是不同的有界上下文,可能是你可以使用Domain事件(它对交叉有界上下文通信有帮助)

答案 1 :(得分:0)

首先,正如您other question中指定的那样,UserImages本身并不是一个实体。相反,可能有一个名为UserImage的实体,它引用用户的图像,单数。然后,UserImageRepository可以在必要时使用分页提供对与用户关联的所有图像的访问。

现在,用例是:

  

添加新用户图片时,如果未设置用户的个人资料图片,   设置为添加的图片。

一词表示domain event。在这种情况下,事件为UserImageAdded。粗体 if 和随后的设置表示响应事件所需的行为。

要实现此用例,必须在添加用户映像时发布事件,并且必须为实现所需行为的处理程序订阅此事件。此链接域事件文章提供了C#中的示例实现,但是该概念可以轻松移植到PHP。总的来说,所需的组件是:

  • 应用程序服务,用于处理用户图像的添加。该服务将发布该活动。
  • 事件发布者,由应用程序服务调用,允许发布者与订阅者脱钩。
  • 事件处理程序,它处理UserImageAdded事件并调用所需的行为。