所以猜测我有这种域事件:
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){...
您的领域专家使用短语"BookType1"吗?你说每种类型的书都有不同的逻辑路径——我建议询问理性,也许每个事件都有一个更面向领域的名称?试着听领域专家描述这两种情况时使用的语言。
如果你能找到更多的描述性语言,我会选择基于继承性的单独事件。有了一些域事件机制,您可以订阅处理抽象超类或任何一种专业化,如果您想要这种灵活性,这可能会有所帮助。
另一方面,如果它真的只有booktype1和booktype2,将来可能只有booktype3和booktype4,我会考虑枚举,甚至只是整数,并考虑在不同的策略中实现不同的逻辑路径,并让您的域事件处理程序使用工厂为给定的书类型返回适当的策略,然后委托策略来执行逻辑。
事件名称是DDD中的重要组成部分(事实上,任何"名称"都很重要),因此我建议对不同的事件使用不同的事件名称,因为这些名称包含大量信息。此外,如果您使用类型代码(带有enum
),则会由于额外的if
s而增加CRAP
索引。
您应该只有一个BookChangedName事件,并具有该事件的BookType属性。事件的处理程序/订阅者应该负责逻辑。