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

时间:2016-01-20 06:53:26

标签: domain-driven-design cqrs domain-model

我发现很难确定某些内容应该是域名还是应用程序的一部分。

阅读这篇answer对授权等概念有很大帮助,但我仍然发现自己在与其他事情挣扎。

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

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

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

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

我目前的设置是这样的:

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

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

1 个答案:

答案 0 :(得分:3)

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

应用程序功能:电子邮件通知,授权,持久性等。除域之外,您的系统的所有功能都来自此处。

应用程序协调:要满足用例,您需要协调应用程序功能和域。所有的管道都来到这里。

请记住,应用程序协调模型使用案例,因此并不总是匹配1个app service = 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
  

为什么我不在应用程序中完成所有操作以减少混淆?

责任分离,松耦合,依赖感染等;所有这些都有很多原因。我将给你一个我最近参与的一个真实的例子:只有Domain服务的松散耦合程序集(它在.NET框架中)允许我在Web应用程序,DesktopApp和SOAP Web服务中托管相同的域。更改应用程序协调服务,因为每个应用程序的要求和用例都不同。

关于什么进入域名,什么不是。很难给你一个直接的答案,因为它取决于你的域名是什么。

  

确保用户在最后一分钟内未发布超过5条评论

你必须质疑为什么要节流?为了防止凌乱的用户界面?表现原因?防止拒绝服务威胁?或者在你的游戏中违反规则"因为你的游戏"只是在一次垃圾邮件中向用户提供有限的尝试?这是什么表明什么是域或应用程序。