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){... 
+0

如果您的booktype是不同的聚合体,如果您使用继承,可能会与单个父体一起使用,您可以使用相同的事件并在基类中具有处理程序。 –

回答

0

事件名称是DDD的重要组成部分(其实任何“名”是很重要的),所以我建议那些名携带了大量的信息,以用于不同的事件不同的事件名称。此外,如果您使用类型代码(使用enum),您会增加CRAP索引,因为有额外的if

0

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

+2

该声明背后的推理是什么? – plalx

+0

它们是类似的事件BookChangedName,BookType1ChangedName,BookType2ChangedName等。不是为每种书类型创建不同的事件类,而是让事件的处理程序实现如何处理每种书类型。处理程序可以使用策略模式,因此它不必处理if/else语句。 – alltej

2

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

如果你可以找到更多的描述性语言,我会去基于继承的单独事件。通过一些域事件机制,您可以订阅处理抽象超类或任何一种特殊化,如果您想要这种灵活性,这可能会有所帮助。另一方面,如果它真的只是booktype1和booktype2,未来可能是booktype3和booktype4,我会考虑一个枚举或甚至只是一个整数,并考虑在不同的策略中实现不同的逻辑路径并让您的域事件处理程序使用工厂为给定的书籍类型返回适当的策略,然后委托执行逻辑的策略。