与CQR的多一关系的替代方案
-
30-09-2019 - |
题
我们如何与CQRS/DDD建模经典的多对多关系?
我知道DDD和CQRS的实现和解决方案都往往是特定于域的,因此可能很难提出这个问题的一般答案。
但是,假设我们之间有熟悉的关系 书 和 作者. 。这是经典的多一关系。
对我来说,似乎最自然 书 和 作者 有两个不同 实体 每个人都属于自己的 聚集根. 。因此,对它们之间的多对多关系进行显式建模并不是要走的路。
我们如何建模AddbookCommand?我们希望能够在我们的库中添加一本书,并且以某种方式指出了一个特定的 作者 写了 书. 。我们如何建模(并坚持)这种关系?
两者都不 书 也不 作者 似乎是好候选人 值对象...
解决方案
假设两者都是聚合的,请在添加新书后将所需的任何作者数据复制到汇总的书籍中,以便任何后续命令都有足够的作者数据可以使用。现在,如果作者汇总需要有关作者写的书的信息,则可以“订阅” NewBookDed Event(从技术上讲,您可以将RegisterAuthorofBook命令发送给作者汇总,因为NewBookDed Event的事件)。我认为人们也可以以相反的方式对此进行建模,但是我对书籍作者域并不那么亲密。
最重要的是,您并没有真正存储多对多的人,因为它们没有扩展。您必须开始将它们(聚合)视为彼此发送消息。更大的问题是什么需要保持一致,在什么时间点需要保持一致。我们是否在乎作者不会立即反映出已经添加了新书的事实,她/他是作者?作者是否想强制执行他/她写的书(反之亦然)?
另一件事是停止以数据为导向并以行为为导向。这本书和作者汇总的行为是什么?这将确定在该点以及应如何建模的情况下需要哪些数据。
http://pastie.org/1220582 第一次刺入这本书。
不隶属于 StackOverflow