Domain driven design 会计领域中的CQRS、DDDD

Domain driven design 会计领域中的CQRS、DDDD,domain-driven-design,cqrs,dddd,Domain Driven Design,Cqrs,Dddd,我想知道如何正确地建模我的聚合。域是accounting,我有三个实体:Account、AccountingEntry(这应该是一个值对象吗?)和AccountingTransaction。账户可以是客户的银行账户。AccountingEntry是账户中的一个分录,AccountingTransaction将构成单个交易的多个分录联系起来(例如,从账户a转账到账户B)。一起 我的想法是将Account和AccountingTransaction建模为聚合,AccountingEntry建模为Ac

我想知道如何正确地建模我的聚合。域是accounting,我有三个实体:Account、AccountingEntry(这应该是一个值对象吗?)和AccountingTransaction。账户可以是客户的银行账户。AccountingEntry是账户中的一个分录,AccountingTransaction将构成单个交易的多个分录联系起来(例如,从账户a转账到账户B)。一起

我的想法是将Account和AccountingTransaction建模为聚合,AccountingEntry建模为AccountingTransaction中的集合。这是为了允许会计事务聚合强制执行不变量,即事务中的所有条目总和必须为零。这些条目将包含对其关联帐户ID的引用(如果我们想撤销交易,这将非常有用)。账户将不包含任何对分录的引用,但将保留余额

我会用一个传奇故事来管理交易账户的贷记和借记过程

我想知道我的建模是否正确


我还想知道如何确保不能创建包含无效(不存在)帐户引用(ID)的会计分录。该帐户是否应该用作创建条目的工厂,并传递其自己的ID?

我认为该模型非常好。根据Martin Fowler的观点,您可以使用事务作为条目的工厂(使用帐户作为参数)。

我认为您还必须在理想主义和务实主义之间做出选择。据我所知,DDD纯粹主义者要求实体始终有效。你打算如何使用你的模型来实现这一点?如何向事务中添加条目并使其总和为0,而不会在添加条目行之间无效?(即贷记1000,然后添加借记500,然后添加借记500以平衡交易)在添加最终分录之前,实体将无效?实际上,你可以改变你所追求的规则,只要求实体在保存之前是有效的。至于如何防止引用无效(不存在)的帐户,如果你使用关系数据库作为你的存储,数据库将免费为你强制执行完整性。