DDD 使用事件或服务?

DDD use event or service?

大家好,我是 ddd 设计的新手,正在尝试使用此模式在 C# 中开发我的第一个应用程序

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

我是否应该创建一个域服务来确保合约资产中的每个操作都会产生一个帐户操作,并在应用层调用此服务发送帐户实体的集合。或者我应该将存储库注入此服务加载帐户列表并保存帐户和操作列表中的更改。

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

我有点糊涂

先回答最后一个问题。事件用于可以异步完成的事情,在这种情况下异步将不起作用。每次保存聚合时,它都应该满足所有业务规则,因此您必须同时处理资产和帐户。

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

通常这类问题可以使用事件优雅地解决,并关注每个事务的一个聚合。

假设您的用例是向合约添加资产。

您将拥有一个带有 ContractRepository 的应用程序服务,它将检索合同,并且将对该合同调用一个方法 addAsset

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

您的应用程序内的一些订阅者将收到有关该事件的通知并会做一些事情。在这种情况下,您可以拥有一个 UpdateAccountOnAssetAdded,它会在内部完成剩余的工作。

This article 将帮助您了解在这种架构中一切是如何组织的。

祝你好运!