DDD使用事件还是服务?

时间:2019-11-12 05:33:42

标签: c# domain-driven-design onion-architecture

您好,我是ddd设计的新手,正在尝试使用在C#中工作的这种模式来开发我的第一个应用程序

在我的应用程序中,我有一个包含子实体资产的合计合同,当添加或结算资产时,我应该在另一个合计帐户中执行会计操作并确保其在业务逻辑中。

我应该创建一个域服务,以确保合同资产中的每个操作都会引发一个帐户操作,并在应用程序层中调用此服务以发送帐户实体集合。还是应该向该服务注入存储库以加载帐户列表,并将更改保存在帐户和操作列表中。

甚至使资产实体中的方法引发强制执行帐户更改的事件。如果这是正确的方法,则事件句柄应该在域或应用程序中?帐户实体中的处理程序是否应该在域中通过注入的存储库执行更改?

我有点困惑

2 个答案:

答案 0 :(得分:0)

通常,可以使用事件优雅地解决此类问题,并专注于每个事务的一个汇总。

假设您的用例是将资产添加到合同中。

您将拥有一个带有ContractRepository的应用程序服务,该服务将检索Contract,并在该Contract上调用方法sub

将资产添加到“合同”聚合时,此聚合将记录一个域事件,例如AssetAdded,以及有关该操作的所有相关信息。然后,您的应用程序服务会将更新后的Contract保留在数据库中,然后将事件发布到异步总线。在这一刻,您可以发送回复。

您的应用程序内部的某些订户将收到有关该事件的通知,并将执行操作。在这种情况下,您可以拥有一个UpdateAccountOnAssetAdded,它将在内部完成其余的工作。

This article将帮助您了解在这种架构内所有事物的组织方式。

祝你好运!

答案 1 :(得分:-1)

让我们首先回答最后一个问题。事件是针对可以异步完成的事情,在这种情况下,异步将无法正常工作。每次保存汇总时,它都应满足所有业务规则,因此您必须同时处理资产和帐户。

应谨慎使用服务。它们在多个AR上运行,其中没有一个与其他AR具有强制关系。在您的情况下,Contract拥有所有其他相关实体,因此所有工作应在Contract的方法内完成。如果需要存储库,则将其注入到合同中。

相关问题