领域事件可以在领域服务中引发吗?

3

我想知道在领域服务中是否可以引发领域事件?我有一段用C#编写的代码。当然它可以运行,但从DDD角度来看,它正确吗?

第一个例子与用户删除相关。在我的系统中,账户有多个用户。在用户被删除后,会引发AccountUserRemovedDomainEvent。然后基础设施层中的订阅者处理审计日志管理。它添加适当的日志,描述此操作。

public void RemoveUser(AccountUserEntity user, AccountEntity account)
{
  AccountUserRepository.Delete(user);
  DomainEvents.Raise(new AccountUserRemovedDomainEvent(user));
}

这是第二个例子。在这种情况下,除了在基础设施层创建审计日志订阅者外,还会向用户发送带有激活链接的电子邮件。

public void SaveAccountUser(AccountUserBasicInformation information, AccountEntity account)
{
  var user = Mapper.Map<AccountUserEntity>(information);

  account.Users.Add(user);
  user.Account = account;

  DomainEvents.Raise(new AccountUserAddedDomainEvent(user));
}

1
这里展示的两个例子不符合Evans在DDD书籍中描述的“领域服务”模式(请参见第5章)。 - VoiceOfUnreason
1个回答

2

一个领域事件通常是对领域对象应用操作/命令的结果。因此,它可能不是领域服务关心的内容。您可能需要一些技术系统事件/消息,但那些与领域服务有所不同。

我喜欢使用返回领域事件的方法来进行测试,而不是使用引发事件的单例模式。如果您最终得到与多个领域对象交互的领域服务,您可以选择返回事件,但有时您会需要将事件与其事件流添加到事件溯源中。根据您的实现方式,聚合根也可以跟踪新事件。在这两种情况下,都有事件的容器,因此没有必要返回或引发它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接