我最近在学习DDD,并不太了解这些概念。我对示例博客应用程序有一些疑问。
假设博客系统中有四个域对象:User
,Blog
,Post
和Comment
。一个User
只能有一个Blog
,一个Blog
有多个Post
个实体,Post
有多个Comment
个实体。
我的设计是Blog
是聚合根:
class Blog {
private User;
private List<Post> posts;
}
class Post {
private List<Comment> comments;
}
class BlogRepository {
public void saveBlog(Blog blog);
public void findBlogById(long id);
public void getAllBlogs();
}
我是否可以像这样设计聚合根和存储库?
我有一些要求可以让用户为所有Comment
个实体添加所有Blog
个实体,并且User
也可以修改自己的Comment
{{1}} }。
我的问题是如何实现这些要求?
答案 0 :(得分:2)
虽然您提供的模型反映了域,但它不是最佳的DDD实现。使用DDD,除了考虑实体之间的关系外,还必须考虑事务一致性边界。因此,最好将Blog
,Post
和User
设计为单独的聚合,这些聚合仅通过ID引用彼此。而且,Blog
实体没有理由需要有一组帖子。您永远不需要加载整个博客,行为永远不会跨越多个帖子。相反,提供一个分页存储库方法来加载博客的帖子子集。但是Comment
可以是值对象,因此评论集合应与Post
聚合一起加载。获取用户所有注释的最简单方法是创建一个存储库查询方法,该方法返回read-model以防止查询与实体中的行为混淆。有关设计聚合的更多信息,请查看Effective Aggregate Design。