假设我有一个名为文档的对象,它有一堆图像,音频,视频等形式的孩子。因此,我的应用程序的用户可以通过键入一些文本,添加图像,视频来创建文档根据我在DDD中的理解,文档是聚合的,而图像,视频总是与作为根的文档相关联。基于这种理解,我将如何设计一个能够为用户创建/编辑文档的应用程序?我可以有一个REST端点来在一个请求中上传文档及其所有子项,但这可能是长时间运行的操作。或者,我可以设计2个休息端点,一个用于上传文档的文本正文并重复调用另一个以上传其子节点,这实际上意味着多个事务。第二种方法仍然是DDD吗?我是否通过将文档创建和更新分成多个请求来违反事务边界?
答案 0 :(得分:6)
一致性边界(我更喜欢该术语而不是“事务边界”)不是指定允许更改的粒度的概念。他们告诉你什么可以原子地改变,什么不能改变。
例如,如果您将文档设计为与图像分开的聚合,则不应在一次用户操作中更改文档和图像(即使技术上可行)。这意味着聚合不能太小,因为这对用户来说过于严格。但它们也应该不会太大,因为一次只有一个用户可以更改聚合,因此更大的聚合会产生更多的冲突。
您应该尝试尽可能小地设计聚合,但仍然足够大以支持您的用例。因此,您必须使用上述规则自行计算您的应用程序。
因此,从DDD的角度来看,您提到的两种方法都是有效的。