DDD:什么进入域和什么应用程序?

Den*_*nov 5 domain-driven-design domain-model cqrs

我发现很难决定某些东西应该是域名还是应用程序的一部分.

通过这个答案阅读有助于很多概念,如授权,但我仍然发现自己正在努力与其他事情.

为了说明我的困惑,请考虑发表评论的案例.以下是在发布评论之前需要执行的操作.我在括号中指出我认为这个功能应该去哪里.

  • 确保允许用户角色/状态对此帖子发表评论(授权,转到应用程序)
  • 确保我们正在评论的帖子存在并发布(域名)
  • 确保用户在最后一分钟没有发布超过5条评论(限制,直觉说它转到应用程序)
  • 确保注释不是空字符串(域)
  • 确保评论没有脏话(域?)
  • 确保评论在此帖子中没有来自同一用户的重复项(域名?)
  • 格式化评论(应用程序)
  • 从评论中删除当前用户不允许的某些HTML标记(应用程序)
  • 检查垃圾评论(应用程序?)

我无法确定检查垃圾评论是否是域关注或应用程序,同样适用于限制.从我的观点来看,这些问题对我来说都很重要,必须存在.但同样适用于授权,我们知道它不应该在域中.

如果我在域服务和应用程序服务之间拆分这些问题,那么我觉得我的域名没有完全执行,实际上依赖于应用程序进行事先检查.在这种情况下,重点是什么,为什么我不应该在应用程序中全部完成以减少混淆?

我目前的设置是这样的:

Controller -> App.CommentingService.Comment() -> Domain.CommentingService.Comment()

如果有人可以通过所有必需的步骤来创建注释并将其分配到正确的层,从而给出一些推理,那将会很有帮助.

jlv*_*ero 3

您的设置看起来正确。应用程序服务通常有两种类型:

应用功能:电子邮件通知、授权、持久化等。除了域名之外,您的系统的所有功能都在这里。

应用程序协调:为了满足用例,您需要协调应用程序功能和域。所有的管道都集中在这里。

请记住,应用程序协调模型用例并不总是匹配 1 个应用程序服务 = 1 个域服务,因为用例可能涉及 1 个以上的进程。

 Controller 
     App.CommentingService.Comment() //coordination of below features and domain
         App.AuthService().Autorize(); //feature
         Domain.CommentingService.Comment(); //domain
         App.PersistenceService().Persist(); //feature
         App.NotificationService().SentNotificationToUser(); //feature
Run Code Online (Sandbox Code Playgroud)

为什么我不把这一切都放在应用程序中来减少混乱呢?

责任分离、松耦合、依赖注入等;所有这些都是有好处的,原因有很多。我将给你一个我最近参与的真实例子:拥有一个松散的组合程序集(它在 .NET 框架中),仅包含域服务,使我可以在 Web 应用程序、桌面应用程序和 SOAP Web 服务中托管相同的域而不受影响更改应用程序协调服务,因为每个应用程序的要求和用例都不同。

关于什么进入域,什么不进入域。很难给你一个直接的答案,因为这很大程度上取决于你的领域是否属于你的领域。

IE

确保用户在最后一分钟发表的评论不超过 5 条

你一定要问为什么要节流?为了防止用户界面混乱?性能原因?防止拒绝服务威胁?或者是否违反了“游戏”中的规则,因为您的“游戏”只是在时间垃圾邮件中向用户提供了有限的尝试?这表明某物是域或应用程序。

  • 您的域就是规则,反之亦然。即使您的应用程序中没有出现错误或异常,破坏规则就是破坏领域。我认为这些规则的执行属于该领域。无论如何,要小心这样的直接答案,因为我不知道完整的上下文。 (2认同)
  • XSS?这是一个网络问题。绝对不是域。:) (2认同)