您好,我是ddd设计的新手,正在尝试使用在C#中工作的这种模式来开发我的第一个应用程序
在我的应用程序中,我有一个包含子实体资产的合计合同,当添加或结算资产时,我应该在另一个合计帐户中执行会计操作并确保其在业务逻辑中。
我应该创建一个域服务,以确保合同资产中的每个操作都会引发一个帐户操作,并在应用程序层中调用此服务以发送帐户实体集合。还是应该向该服务注入存储库以加载帐户列表,并将更改保存在帐户和操作列表中。
甚至使资产实体中的方法引发强制执行帐户更改的事件。如果这是正确的方法,则事件句柄应该在域或应用程序中?帐户实体中的处理程序是否应该在域中通过注入的存储库执行更改?
我有点困惑
答案 0 :(得分:0)
通常,可以使用事件优雅地解决此类问题,并专注于每个事务的一个汇总。
假设您的用例是将资产添加到合同中。
您将拥有一个带有ContractRepository的应用程序服务,该服务将检索Contract,并在该Contract上调用方法sub
。
将资产添加到“合同”聚合时,此聚合将记录一个域事件,例如AssetAdded,以及有关该操作的所有相关信息。然后,您的应用程序服务会将更新后的Contract保留在数据库中,然后将事件发布到异步总线。在这一刻,您可以发送回复。
您的应用程序内部的某些订户将收到有关该事件的通知,并将执行操作。在这种情况下,您可以拥有一个UpdateAccountOnAssetAdded,它将在内部完成其余的工作。
This article将帮助您了解在这种架构内所有事物的组织方式。
祝你好运!
答案 1 :(得分:-1)
让我们首先回答最后一个问题。事件是针对可以异步完成的事情,在这种情况下,异步将无法正常工作。每次保存汇总时,它都应满足所有业务规则,因此您必须同时处理资产和帐户。
应谨慎使用服务。它们在多个AR上运行,其中没有一个与其他AR具有强制关系。在您的情况下,Contract拥有所有其他相关实体,因此所有工作应在Contract的方法内完成。如果需要存储库,则将其注入到合同中。