域驱动设计(示例博客应用程序)

时间:2013-04-24 09:26:19

标签: domain-driven-design

我最近在学习DDD,并不太了解这些概念。我对示例博客应用程序有一些疑问。

假设博客系统中有四个域对象:UserBlogPostComment。一个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}} }。

我的问题是如何实现这些要求?

1 个答案:

答案 0 :(得分:2)

虽然您提供的模型反映了域,但它不是最佳的DDD实现。使用DDD,除了考虑实体之间的关系外,还必须考虑事务一致性边界。因此,最好将BlogPostUser设计为单独的聚合,这些聚合仅通过ID引用彼此。而且,Blog实体没有理由需要有一组帖子。您永远不需要加载整个博客,行为永远不会跨越多个帖子。相反,提供一个分页存储库方法来加载博客的帖子子集。但是Comment可以是值对象,因此评论集合应与Post聚合一起加载。获取用户所有注释的最简单方法是创建一个存储库查询方法,该方法返回read-model以防止查询与实体中的行为混淆。有关设计聚合的更多信息,请查看Effective Aggregate Design