关于聚合
聚合从业务意义上讲,就是一组实体和值对象,其中有一个根实体,访问其他的实体和值对象只能通过根实体。从关系上讲,其他的实体和值对象围绕根实体,附属于根实体,聚合外的其他聚合和实体,不能直接和非根实体通信。如汽车、车门、轮胎就构成一个聚合,其中汽车是根实体,车门和轮胎都是值对象,车门和轮胎不能抛弃汽车主体单独和其他聚合通信。
聚合从技术意义上讲,他是一个事务单元,也就是聚合内部的实体和值对象,要同时产生,同时回滚。
因此在设计一个聚合的时候,要特别考虑聚合的技术意义,因为很多模型看似是一个聚合,但是并不能同时提交,这时设计成多个聚合更好。比如个人信息中,教育背景、工作背景,如果认为是个人信息聚合下的2个实体,那么在进行持久化操作的时候就必须在一个事务下,这样会导致工作背景出错,教育背景也需要重新保存,如果认为2者可以单独保存的话,设计成2个聚合更合适。
聚合之间的通信或者多个聚合相继持久化,最好为异步完成,多个聚合多个事务。
关于事件驱动开发
事件驱动开发往往和领域驱动一起使用,但是领域驱动设计不一定是事件驱动的。在领域驱动中,一个操作需要多个聚合完成时,使用事件驱动比较合适。第一个聚合完成任务后,发布领域事件,其他聚合可以监听这个领域事件,事件发生时,通知所有监听的聚合,这是一种典型的观察者模式。其他聚合完成时,再发布自己的事件,这样形成一个事件链。
事件驱动的好处是,非常的松耦合,可同步、可异步,同步事件可以使用普通的程序完成,异步事件可以使用消息服务。聚合之间可以发布异步事件。缺点是有时差,并且整个系统会变得稍复杂。