Mar*_*ann 37 architecture domain-driven-design cqrs dddd
我们如何使用CQRS/DDD模拟经典的多对多关系?
我知道DDD和CQRS实现和解决方案都倾向于特定于域,因此可能很难对这个问题提出一般性答案.
但是,我们假设我们在Book和Author之间有熟悉的关系.这是一种经典的多对多关系.
对我来说,Book and Author似乎是两个不同的实体,每个实体都属于它们自己的Aggregate Root.因此,明确地模拟它们之间的多对多关系并不是一种可行的方法.
我们如何建模AddBookCommand?我们希望能够在我们的图书馆中添加一本书,并以某种方式说明某位作者撰写本书.我们如何建模(并坚持)这种关系?
无论是书还是作者似乎是不错的候选值对象 ...
Yve*_*out 35
假设两者都是聚合,在添加新书时将您需要的任何作者数据复制到Book聚合中,以便任何后续命令都有足够的作者数据可供使用.现在,如果作者聚合需要有关作者编写的书籍的信息,那么它可以"订阅"NewBookAdded事件(从技术上讲,您可以通过NewBookAdded事件向作者聚合发送RegisterAsAuthorOfBook命令).我认为可以用另一种方式对此进行建模,但我与Book Author域并不是那么亲密.
最重要的是,你并没有真正存储多对多,因为它们不能扩展.您必须开始将它们(聚合)视为彼此发送消息.更大的问题是需要保持一致性以及在什么时间点需要保持一致.我们是否关心作者没有立即反映出一本新书被添加的事实,她/他是作者?是否有任何作者想要对他/她所写的书执行的不变量(反之亦然)?
另一件事是停止面向数据和更多面向行为.书籍和作者聚合的行为是什么?这将告诉我们在哪个点需要哪些数据以及如何建模.
http://pastie.org/1220582首次尝试Book汇总.