首页 > 解决方案 > 如何定义聚合的一对多关系

问题描述

我有两个聚合BlogPost具有一对多的关系(Blog与几个有关Post)。根据领域驱动的设计最佳实践,我不确定是否Blog应该保存一组Post参考:

public class Blog : Entity<BlogId>, IAggregateRoot
{
    IEnumerable<Post> posts;
}

whenPost也通过以下方式获得间接 id 引用BlogId

public class Post : Entity<PostId>, IAggregateRoot
{
    BlogId BlogId;
}

如果需要更多上下文来回答问题,请告诉我。

标签: c#domain-driven-designaggregate

解决方案


在 Vaughn Vernon 所著的《实现领域驱动设计》一书中,您可以找到一整章介绍如何定义聚合以及可以应用的一些经验法则。

其中之一是尽量保持你的聚合尽可能小。在您的情况下,我会选择避免您的 Blog 对象中包含 Post 对象列表。想象一下,您的 Blog 对象有一个属性name,而您只想更改它:当您从数据库中检索该对象时,如果它包含所有 Posts,您也将检索它们,从而为您的用例进行不必要的连接工作,这将降低性能。

从设计的角度来看,Blog 可能不是由它的 Post 定义的,所以实际上你不需要它们在里面。聚合应该负责其所有不变规则(业务逻辑规则),仅此而已。

我的建议是让它尽可能简单,并始终专注于坚实的原则。

祝你好运!


推荐阅读