0

领域事件应该根据事件类,还是类和主题来分派?

例如,我有以下事件:

class UserRegisteredEvent implements INonTransactionalEvent{
    public Timestamp: TTimestamp;
}

还有一个活动经理,

class EventManager {
   /** Omitted **/
}

Udi Dahan提出事件是一流的对象,我喜欢这样。有一个 UserRegisteredEvent对象,一个 OrderComplete对象。我的问题是,类型本身是否绑定到事件处理程序?例如,我应该只将事件对象传递给发布方法吗?

EventManager.Publish(new UserRegisteredEvent(1));

这意味着每个处理程序都绑定到一个类类型,这似乎是有限的。虽然 YAGNI 可能是真的,但以下内容是否更强大:

EventManager.Publish(new UserRegisteredEvent(1), Events.UserRegistered)

其中事件主题是处理程序绑定的内容。这样,处理程序可以从继承中受益。如果类型安全或通用语言的使用是一个问题,可以这样做:

EventManager.UserRegisteredEvent(1)

这只是较长发布版本的一种简短方法。这让我有点恼火,因为这意味着必须为每个新事件更改类,这似乎是不必要的(实际上,如果使用上述方法,则没有必要)。

虽然我只看到事件作为没有主题的类发布,但这是限制性的,还是有人遇到过这个问题?

4

2 回答 2

1

领域事件实际上并不需要特定的实现。毕竟它们只是语义 DTO。我不明白您要完成什么,但除非您正在构建服务总线,否则您只需发送事件对象以由配置的任何处理程序处理。

事件不知道处理程序,处理程序彼此不知道,总线知道如何将事件发送给处理程序。并且您希望处理程序仅显式处理 1 个事件 SRP 。您可以将相关处理程序的实现组合到一个类中,但这是一个实现细节。

于 2014-06-23T14:31:23.537 回答
0

如果您真的想介绍主题,我会通过接口继承来完成。例如:

interface IUserEvent : INonTransactionalEvent { ... }

class UserRegisteredEvent implements IUserEvent {
    public Timestamp: TTimestamp;
}

对您的代码和语言的影响可以忽略不计,您可以继续使用Publish接受的通用方法INonTransactionalEvent,您还可以轻松地重构您的主题。

于 2014-06-23T10:54:39.253 回答