在 Vaughn Vernon 的Implementing Domain-Driven Design
书中,他描述了在聚合根中使用工厂方法。一个例子是Forum
聚合根,它具有startDiscussion
返回聚合根的工厂方法Discussion
。
public class Forum extends Entity {
...
public Discussion startDiscussion(
DiscussionId aDiscussionId, Author anAuthor, String aSubject) {
if (this.isClosed()) {
throw new IllegalStateException("Forum is closed.");
}
Discussion discussion = new Discussion(
this.tenant(), this.forumId(), aDiscussionId, anAuthor, aSubject);
DomainEventPublisher.instance().publish(new DiscussionStarted(...));
return discussion;
}
如何在事件溯源系统中实现这种工厂模式,特别是在 Axon 中?
我相信传统上,它可以以这种方式实现:
StartDiscussionCommand
-> DiscussionStartedEvent
-> CreateDiscussionCommand
->DiscussionCreatedEvent
我们触发 aStartDiscussionCommand
由 处理Forum
,Forum
然后发布 a DiscussionStartedEvent
。外部事件处理程序将捕获DiscussionStartedEvent
、 转换它并触发CreateDiscussionCommand
. 另一个处理程序将Discussion
使用实例化 aCreateDiscussionCommand
并Discussion
触发DiscussionCreatedEvent
.
或者,我们可以改为:
StartDiscussionCommand
-> CreateDiscussionCommand
->DiscussionCreatedEvent
我们触发StartDiscussionCommand
,这将触发一个命令处理程序并调用Forum
的 startDiscussion() 方法,该方法将返回CreateDiscussionCommand
. 然后处理程序将调度 this CreateDiscussionCommand
。另一个处理程序接收命令并使用它来实例化Discussion
. Discussion
然后会解雇DiscussionCreatedEvent
.
第一种做法涉及 4 个 DTO,而第二种做法仅涉及 3 个 DTO。
关于应该首选哪种做法的任何想法?还是有其他方法可以做到这一点?