0

我正在尝试更多地了解DDD并正在经历DomainEvents. 假设我们有三个微服务Service AService BService C

Service A有一个实体Foo定义如下:

public class Foo : AggregateRoot
{
    public string id {get; private set;}

    public string name {get; private set;}

    public string email {get; private set;}
}

并且 theService B是一项依赖于 from 的服务,emailFootheService C依赖于namefrom并且只要via a的值发生变化,数据就会从to和 toFoo复制。Service AService BService CFooBus

我遇到的有关领域事件的指南:

  1. 不要将多余的信息作为DomainEvent数据的一部分共享。
  2. 何时consuming BoundedContext知道Producing BoundedContext可能共享 ID,否则共享完整信息
  3. 不要DomainClasses用来表示事件中的数据
  4. 用于Primitive types数据Events

现在由于指导方针冲突而出现的问题:

这是否意味着当它们发生变化时我应该触发两个不同的事件FooNameChange并且FooEmailChanged只使用 theidupdated valueas 的一部分Event Payload

或者我可以只进行一次DomainEvent调用FooChanged并获取Foo序列化它的状态并触发事件。然后编写一个处理程序作为处理程序的一部分,该处理程序BoundedContext将获取数据并将其放在Bus订阅消息的任何服务上,并且单个服务根据Id附加的和事件 arg(更新的数据)。

4

2 回答 2

1

如果您需要跨服务交谈,您可能应该从 Microsoft Docs中寻找集成事件而不是“域事件”

领域事件与集成事件

从语义上讲,域和集成事件是同一件事:关于刚刚发生的事情的通知。但是,它们的实现必须不同。域事件只是推送到域事件调度器的消息,它可以实现为基于 IoC 容器或任何其他方法的内存中调解器。

另一方面,集成事件的目的是将提交的事务和更新传播到其他子系统,无论它们是其他微服务、限界上下文还是外部应用程序。因此,它们应该仅在实体成功持久化时才会发生,否则就好像整个操作从未发生过。

如前所述,集成事件必须基于多个微服务(其他限界上下文)甚至外部系统/应用程序之间的异步通信。

因此,事件总线接口需要一些允许潜在远程服务之间的进程间和分布式通信的基础设施。它可以基于商业服务总线、队列、用作邮箱的共享数据库或任何其他分布式和理想的基于推送的消息传递系统。

您在集成事件中发送什么信息,这真的取决于。您有以下选择:

  • 发布事件,例如FooNameChangedFooEmailChanged仅使用Idof Foo。在这种情况下,如果您的消费者需要有关已更改内容的更多信息,他们将需要调用您的服务(可能是 REST API 调用)。这种方法的一个缺点是,如果您的事件有很多订阅者,那么所有这些服务都会调用您的服务以几乎同时获取事件的详细信息。

  • 使用消费服务可能需要的完整数据(请注意,它与您的域不同)发布事件,例如PerviousValue,CurrentValue等。如果您的有效负载不是很大,这可能是一个不错的选择。这些类型的事件通常称为“FAT 事件”

于 2020-04-02T02:42:12.173 回答
0

DomainEvents不是补丁文件。

也就是说,我们不是试图创建对更改的通用描述,而是将我们的信息与我们理解的领域概念保持一致。

所以两个变化是属于同一个事件,还是属于不同的事件,得到一个很大的“取决于”。

于 2020-04-02T01:57:41.147 回答