【问题标题】:How entities could be connected with each other inside the domain?域内的实体如何相互连接?
【发布时间】:2013-03-18 13:03:05
【问题描述】:

假设有两个域实体:

  • UserImages 与方法 addNewImage()removeImage($imageId)、getImages( $from, $count)。
  • UserProfile,包含 nameagema​​inImageId 等字段。

在域内需要以下功能:当应用层调用 UserImages -> addNewImage()UserProfile -> ma​​inImageId 会自动设置,以防它为空。

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

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

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

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

非常感谢您的帮助!

【问题讨论】:

    标签: domain-driven-design


    【解决方案1】:

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

    现在,用例是:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 是的,我认为 UserImagesUserProfile 是不同的上下文,因为大多数时候我不需要所有用户的功能。另外,由于某种原因(NoSQL 存储),我需要在域内进行大量跨界连接,以借助域本身等实现配置文件搜索。
      • 就像我说的那样,您可以使用域事件,当您添加图像时,您会发布事件......如果您需要实时通知。
      猜你喜欢
      • 1970-01-01
      • 2019-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      • 2020-07-13
      相关资源
      最近更新 更多