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

Domain driven design 实体如何在域内相互连接?,domain-driven-design,Domain Driven Design,假设有两个域实体: UserImages使用方法addNewImage(),removeImage($imageId),getImages($from,$count) UserProfile带有字段name、age、mainImageId等 域内需要以下功能:当应用程序层调用UserImages->addNewImage(),UserProfile->mainImageId为空时会自动设置 那么,实现域内实体业务逻辑的最佳方式和最佳位置是什么?使用观察服务、引用来自实体的特殊服务或其他方式的

假设有两个域实体:

  • UserImages使用方法addNewImage()removeImage($imageId),getImages($from,$count)
  • UserProfile带有字段nameagemainImageId
域内需要以下功能:当应用程序层调用UserImages->addNewImage()UserProfile->mainImageId为空时会自动设置

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

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

$userImages = Domain::userImages($userId); // getting an instance of UserImages
$newImageId = $userImages -> addNewImage();   // adding a new image
我还应该提到,在我的项目中,我将有很多类似于上面描述的逻辑


非常感谢你的帮助

对我来说,用户听起来像是聚合(如果没有上下文,很难给出您的意见:),但它可以解决您的问题


如果Profil和Images是不同的有界上下文,可能您可以使用域事件(这有助于跨界上下文通信)

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

现在,用例是:

添加新用户图像时,如果未设置用户的配置文件图像, 将其设置为添加的图像

术语表示。在这种情况下,事件是
UserImageAdded
。粗体的if和随后的集合表示响应事件的所需行为

要实现此用例,必须在添加用户映像时发布一个事件,并且必须为该事件订阅一个实现所需行为的处理程序。这篇链接的域事件文章提供了一个C#的示例实现,但是这个概念可以很容易地移植到PHP。总体而言,所需组件包括:

  • 处理用户图像添加的应用程序服务。此服务将发布事件
  • 由应用程序服务调用的域事件发布程序,允许发布程序与订阅服务器分离
  • 一个域事件处理程序,它处理
    UserImageAdded
    事件并调用所需的行为

是的,我认为UserImages和UserProfile是不同的上下文,因为大多数时候我并不需要所有用户的功能。此外,由于某些原因(NoSQL存储),我需要域内的大量跨境连接,以便在域本身的帮助下实现配置文件搜索等。正如我所说,您可以使用域事件,当您添加图像时,您可以发布事件。。。如果您需要实时通知。