另外, 为了能让大家对我有一个更加具体的了解, 我也特地按照flyzb的思想设计了一个基于领域事件和DDD的架构.
该架构的核心思想是:
1. 领域模型好比是一个实心的圆球,圆球的表层就是领域服务(Domain Service),圆球内部由各个相互平等的,没有相互依赖的,通过事件消息完成相互协作的领域对象组成;
2. 领域模型应该依赖于一个中央事件处理器,该处理器负责统一协调领域模型的各种动作;具体地说就是该处理器能够智能的知道任何一个领域事件该如何处理,也就是说它知道该调用哪些事件响应者完成各自的响应;
3. 关于领域服务,应该是非常薄的一层,它的职责非常简单,就是生成领域事件,然后让事件处理器去发布领域事件,仅此而已;
4. 关于领域对象,每个领域对象主要做两件事情:一:在需要的时候生成领域事件,然后让事件处理器发布该领域事件;二:响应并处理一些它所关心并能单独处理的领域事件;
5. 领域模型应该处在正在应用的中心位置,因为它包含了整个应用的所有业务逻辑,包括流程控制逻辑和业务逻辑。任何其他的东西比如数据持久层、应用层、表现层都只是一些辅助的东西。比如数据持久层只是用来将领域模型的任何修改持久化到某种数据存储介质如数据库,应用层只是用来将领域模型做进一步封装(Facade),它提供面向用户操作的各种应用接口供表现层使用,应用层中所有接口可以分为两类:1)调用领域模型实现,一般是行为型操作(ADD、Update、Delete、或其任意组合);2)调用查询服务(该查询服务完全和领域模型无关)提供各种查询功能;也就是说在我看来我们应该应用CQRS的思想来实现应用层。最后,表现层其实和领域模型没有任何关系,它应该需要使用应用层即可。
总结:基于上面的思想,一个完整的领域模型由三个要素组成:领域服务+领域对象+领域事件。然后,为了能让这三个要素能协调工作,还需要借助一个中央事件处理器来完成统一协调的工作。另外,领域模型处于整个应用的中心,其他任何东西都只是作为辅助产品将该中心从各种角度进行扩展以满足用户需要;或者实现持久化目的,以便整个领域模型的状态可以被保存和恢复。
架构源代码为:
http://files.cnblogs.com/netfocus/EventBasedDDDExample.rar
希望能得到大家的意见和建议.