Domain driven design 领域驱动设计(一个示例博客应用程序)

Domain driven design 领域驱动设计(一个示例博客应用程序),domain-driven-design,Domain Driven Design,我最近在学习DDD,不太了解DDD的概念。我对一个示例博客应用程序有一些问题 假设博客系统中有四个域对象:User、blog、Post和Comment。一个用户只能有一个博客,一个博客有多个帖子实体,一个帖子有多个评论实体 我的设计是,Blog是聚合根: class Blog { private User; private List<Post> posts; } class Post { private List<Comment> comment

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

假设博客系统中有四个域对象:
User
blog
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();
}
class博客{
私人用户;
私人名单员额;
}
班岗{
私人名单评论;
}
类BlogRepository{
公共博客(Blog-Blog);
public void findBlogById(长id);
public void getAllBlogs();
}
我这样设计聚合根目录和存储库对吗

我需要获得用户为所有
博客
实体添加的所有
评论
实体,并且允许
用户
修改自己的
评论


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

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

因为我正在使用DDD开发博客引擎,所以我对这些问题进行了大量思考,我可以说,评论不是一个价值对象。它是一个实体:评论本身与帖子没有直接关系,帖子AR(我在这里只谈论域)没有理由知道评论。帖子和评论彼此相连,但它们是相当独立的。一个人可以独立工作。阅读模式将它们“结合”在一起,即使这样,也只与上下文相关。这当然是有道理的。看起来你可以从最初将评论建模为VO,然后当需要更多围绕评论的功能时,可以将其“升级”为AR。@MikeSW:这是否意味着我需要一个评论库?@davenkin虽然我会对你的问题回答“是”,但这并不是因为它是“需要”,但因为有一个是有意义的,所以尽量避免考虑任何领域建模,比如设计db模式。1对1或1对多关系是典型的关系数据库思维。他们在DDD中没有位置。