c# - 如何定义聚合的一对多关系
问题描述
我有两个聚合Blog
并Post
具有一对多的关系(Blog
与几个有关Post
)。根据领域驱动的设计最佳实践,我不确定是否Blog
应该保存一组Post
参考:
public class Blog : Entity<BlogId>, IAggregateRoot
{
IEnumerable<Post> posts;
}
whenPost
也通过以下方式获得间接 id 引用BlogId
:
public class Post : Entity<PostId>, IAggregateRoot
{
BlogId BlogId;
}
如果需要更多上下文来回答问题,请告诉我。
解决方案
在 Vaughn Vernon 所著的《实现领域驱动设计》一书中,您可以找到一整章介绍如何定义聚合以及可以应用的一些经验法则。
其中之一是尽量保持你的聚合尽可能小。在您的情况下,我会选择避免在您的 Blog 对象中包含 Post 对象列表。想象一下,您的 Blog 对象有一个属性name
,而您只想更改它:当您从数据库中检索该对象时,如果它包含所有 Posts,您也将检索它们,从而为您的用例进行不必要的连接工作,这将降低性能。
从设计的角度来看,Blog 可能不是由它的 Post 定义的,所以实际上你不需要它们在里面。聚合应该负责其所有不变规则(业务逻辑规则),仅此而已。
我的建议是让它尽可能简单,并始终专注于坚实的原则。
祝你好运!
推荐阅读
- php - Drupal 7 服务休息 api
- javascript - 如何使用 JavaScript 中的按钮动态添加/删除父节点?
- google-chrome-extension - window.GLOBALS[17] 在新的 Gmail 用户界面中为空,而在旧版 Gmail 用户界面中存在
- angular - Observable.timer 比预期延迟第二次调用
- css - 两个 div 内联块,第一个水平居中
- mysql - 错误 1054 (42S22):“on 子句”中的未知列“b.id”
- java - 在 Eclipse 中仅使用 .jar 文件重建整个项目时导入 jar 文件
- php - 用户角色权限 PHP
- reactjs - 我想在 React 的网页中使用嵌入式浏览器
- node.js - 为什么 Socket.io 服务器会覆盖节点 http 中间件?