我正在建立档案,这是视频需求系统的一部分。想想像Windows资源管理器这样的存档,其中多个用户可以创建文件夹,上传视频,重新构建文件夹等。有业务规则(权限)确定是否允许用户执行任务(即重命名文件夹,移动文件夹,查看文件夹等)。
我已将每个文件夹建模为聚合根,并将一个文件夹移动到另一个文件夹似乎会影响两个聚合根。
根据我的理解,我应该发送一个事件来修改其他聚合。然而,我担心的是,如果第二个文件夹也被修改(比如删除或从系统中删除),那么我需要发送一个补偿命令来撤消第一个聚合更改。
我更喜欢某种处理移动(两个聚合上的更改)的事务,如果失败,那么至少我不需要撤消移动的第一部分或者引发事件的第一部分。
这导致我,CQRS是否适合我试图解决的问题?如果是这样,我的聚合是错误的吗?
答案 0 :(得分:3)
在DDD中,Aggregate应代表事务边界。需要涉及多个聚合的交易通常表明应该改进模型,或者应该审查交易要求,或者两者兼而有之。
这是一个纯DDD问题,与CQRS或任何其他架构模式无关。
另一方面,你真的需要重新发明像包含文件的文件夹这样的层次结构吗?据我所知,这已经解决了很长一段时间的问题。也许再次正式确定特定领域没有固有的优势。
使用DDD模式的域建模在有界上下文中最有意义,其中(1)域非常复杂,(2)域的建模将使您的软件比类似的应用程序具有真实(例如竞争)优势。如果特定的有界上下文相当简单和/或改造它并没有带来真正的巨大优势,那么最好使用最简单的解决方案。
这代表了喔喔在域驱动设计中最重要的概念,即专注于核心领域