DDD设计和HttpDelete

时间:2018-05-26 09:19:51

标签: domain-driven-design

我是DDD设计概念的新手,但我想在阅读有关它的文章时澄清一些内容。 Jimmy Boggard使用以下词语: "除了根实体之外,聚合边界之外的任何内容都不能包含对内部任何内容的引用。","只能使用数据库查询直接获取聚合根。其他一切都必须通过遍历完成。"

我们想删除对帖子的评论。据我所知,帖子是root。因此,所有与评论的沟通都应该通过post对象进行。 这意味着我需要将聚合根的id和聚合实体的id作为HTTP删除请求的参数?

2 个答案:

答案 0 :(得分:2)

  

这意味着我需要将聚合根的id和聚合实体的id作为HTTP删除请求的参数?

简答:是的。

更长的答案:为了与从属于聚合根的实体进行交互,您需要路由到根(因此需要Id),并且需要将根目录作为参数传递给根指定目标实体。

DELETE不支持请求正文;所以参数需要是原始服务器可以单独从URI中恢复的东西(参数被编码到URI中,或者URI允许您访问知道参数是什么的资源)。

注意:Review应该是Post聚合中的从属实体,这一点并不明显。聚合设计是关于行为而不是关系。如果将Review建模为Post的单独聚合,可以让您的生活更轻松,那么您应该考虑它。

答案 1 :(得分:0)

这样做会更实际,但你绝对不必这样做。您的REST API并不一定是您的域模型的精确反映 - HTTP和DDD是两种截然不同的范例,具有自己的约束和世界观。

有效的替代方法是仅根据Post检索正确的ReviewId,并要求发帖删除评论

DELETE /reviews/1234

...
post = postRepository.getPostForReview(reviewId);
post.deleteReview(reviewId);

虽然我同意在这个特定的实例中,DELETE /posts/1234/reviews/5678可能是更好的URI。