在 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。
关于应该首选哪种做法的任何想法?还是有其他方法可以做到这一点?