0

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

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){...
4

3 回答 3

2

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

如果您能找到更具描述性的语言,我会使用基于继承的单独事件。使用某些领域事件机制,您可以订阅处理抽象超类或任一专业化,如果您想要这种灵活性,这可能会有所帮助。

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

于 2017-02-15T07:09:01.203 回答
0

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

于 2017-02-15T00:54:58.347 回答
0

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

于 2017-02-14T18:09:25.177 回答