域事件 - 继承或使用枚举

时间:2017-02-14 15:58:08

标签: event-handling domain-driven-design event-sourcing domain-events

所以我想我有这种域事件:

class BookChangedName...
class BookType1ChangedName extends BookChangedName...
class BookType2ChangedName extends BookChangedName...

那更好还是:

class BookChangedName{
    enum bookType = BOOK_TYPE_1;
}

因为他们只说在类之间存在不同的行为时才使用继承,所以我假设我会使用枚举样本(情况#2) - 因为域事件只是简单的简单DTO。

但同样,在我的域中,这些不同类型的事件具有不同的含义(不同的处理路径)。因此,如果我使用示例#1,我最终会得到很多:

if(event instanceof BookType1ChangedName){
   //do smth in domain
}
else if(event instanceof BookType2ChangedName){
   //do smth in domain
}

而且我也不能像以下那样明确:

when(BookType1ChangedName event){...

我必须做一些预处理,如:

@EventHandler(matcher_pattern = event->event.bookType==BOOK_TYPE_1)
when(BookChangedNameevent){...

3 个答案:

答案 0 :(得分:2)

您的域名专家是否使用短语“BookType1”?你说每种书的类型有不同的逻辑路径 - 我建议查询理性,也许每个事件都有一个更加面向域名的名称?尝试并聆听领域专家使用的语言来描述这两种情况。

如果你能找到更多的描述性语言,我会根据继承性进行单独的事件。使用一些域事件机制,您可以订阅处理抽象超类或任一特化,如果您需要这种灵活性,这可能会有所帮助。

另一方面,如果它真的只是booktype1和booktype2,将来可能是booktype3和booktype4,我会考虑枚举甚至只是一个整数,并考虑在不同的策略中实现不同的逻辑路径让您的域事件处理程序使用 factory 为给定的书籍类型返回适当的策略,然后委托策略执行逻辑。

答案 1 :(得分:0)

事件名称是DDD中的一个重要部分(实际上任何“名称”都很重要)所以我建议为不同的事件使用不同的事件名称,因为这些名称带有大量信息。此外,如果您使用类型代码(使用enum),则会因为额外的CRAP而增加if索引。

答案 2 :(得分:0)

您应该只有一个BookChangedName事件,并且该事件具有BookType属性。事件的处理程序/订阅者应该处理逻辑。