【问题标题】:Can repositories be used in domain services?存储库可以在域服务中使用吗?
【发布时间】:2021-06-20 21:22:29
【问题描述】:

在阅读了 Eric Evan 关于域驱动设计的书之后,我正在尝试实现我的第一个域驱动应用程序。我对如何创建值对象有点困惑。

因此,在我的应用程序中,用户可以购买一项服务,让他们在 Youtube 上发布的视频获得一定数量的观看次数,这由观看这些视频的我的应用程序的其他用户完成,激励他们会为他们观看的每个视频赚取金币(以应用货币计),然后他们可以用这些金币来宣传他们的视频(基本上是许多 youtube 推广应用的复制品,用于学习)。

假设服务在应用程序中表示为一个名为 WatchTime 的实体。 WatchTime 实体包含一些信息,如视频 URL、MaxViews(购买的最大观看次数)和 CurrentViews(已完成的观看次数)等以及排名。此排名决定了该排名的显示频率。

当用户打开页面观看视频赚取金币时,应用程序应该获得 N 个 WatchTimes,比如 10 个,一旦用户完成观看,下一批 N 个 WatchTimes 将被加载。10 个要加载的观看时间是根据观看时间的排名决定的。

现在回答问题。根据播放排名选择视频的算法将是一个商业问题,因此从存储库获取观看时间的服务将在域中。但是我读过存储库不应该在域中使用,但是该服务将无法检查观看时间的排名并在没有访问存储库的情况下返回它。那我该怎么做呢?

如果说了什么愚蠢的话,请随时告诉我我错了,请解释原因。如果我说的有什么不清楚的地方,请告诉我。

谢谢。

【问题讨论】:

  • 加载的观看时间会怎样?用户界面会只询问下一个视频并播放它们吗?是否会在后端进行验证,以确保观看的视频是根据其排名预期的视频?如果它只是一个简单的查询,那么您只需使用 watchTimesRepository.nextToWatchFor(user) 或类似的东西,它是调用存储库(这是一个域服务)的应用程序层。
  • @plalx 需要根据他们的排名来获取观看时间,所以我认为从我的数据库中选择哪个观看时间的算法将是域的一部分。但是我听说在域服务中使用存储库是不可行的
  • 嗯,按排名排序是一个相当简单的查询。只要域负责排名,您就可以使用存储库按排名进行排序。加载这些观看时间 AR 后,您会如何处理它们?

标签: javascript service architecture repository domain-driven-design


【解决方案1】:

领域服务应该执行聚合、实体或值对象无法执行的业务逻辑,因此我会尽可能避免在其中使用存储库。

在您的情况下,您应该使用存储库来获取包含该信息的聚合,并将该聚合传递给域服务,以便它执行业务逻辑,而不是使用存储库来获取特定数据无法自己执行加法。

【讨论】:

    猜你喜欢
    • 2015-01-11
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    相关资源
    最近更新 更多