经典DDD + CQRS+ES 的一些疑问

linjie 14-08-05
              

以下是我关于经典DDD的简单理解:
在经典的DDD中,大量使用领域服务 Domain Service 和 Factory 来修改聚合根。
复杂的聚合根创建使用 Factory,将Factory 所需的参数全部传进去,Factory内部进行资源调配,包括逻辑验证,仓储 Repository 的调用等。 之后返回一个领域完整的聚合根对象。
而聚合根的修改,基本使用领域服务,不管是单个聚合根的修改,还是多个聚合根,都是一个领域服务内调用。
这其中关于聚合根自身的完整性验证,我基本都放在了聚合根内,一个聚合根必须保证自身的完整性和一致性。
领域服务就只起到协调作用。


而加入了 CQRS ,特别是Event Source ,聚合根之间的协调,基本都是通过领域事件(是否这么理解?),也就自基本弱化了领域服务。

而其中Factory的工作是否也可以交给领域事件去处理? Factory在原来的DDD中担任的任务是聚合根的创建,也可以理解为 专为创建聚合根的领域服务,在Factory 也同样是协调多个聚合根,为新的聚合根提供条件(如新订单的创建,需要用户聚合根,产品聚合根等)。而此时领域服务在领域事件中已经弱化,那么Factory是否也可以弱化或者取消?

而这弱化或取消所带来的问题,是创建聚合根所需的验证谁来负责处理?

求路过的大神指点迷津。

              

banq
2014-08-07 06:57

2014-08-05 16:09 "@linjie"的内容
而此时领域服务在领域事件中已经弱化,那么Factory是否也可以弱化或者取消? ...


首先要看看为什么领域服务在领域事件中已经弱化,聚合根的修改行为应该属于聚合根实体对象自己,用聚合根行为守护其内部状态的一致性是DDD设计核心,如果聚合根内部的状态直接暴露给外界(通过领域服务)任意修改,那么会导致状态变化混乱,难以调试和跟踪。参考:http://www.jdon.com/45347

Factory是负责创建聚合根,这是无法弱化的,符合工厂自身定义。