(2008-1-12更新)
从以上的分析中,我们可以了解到Domain Model分为三种类型:
0. 全局常量对象
1. 长生命周期业务对象(类似保单对象);
2. 交易过程的Transaction对象,几乎没有生命周期的;
3. Request/Response对象。这类对象以前没有识别的,通常和VO混在一起;但是在IAA中以及电信业的模型是这类对象是独立存在,并被持久化的;Request对象建立在增量更新上很有用。当然他们也是几乎没有生命周期的。
并非所有的业务系统都拥有这三类对象!相当一部分的业务系统,并没有显著的长生命周期对象,因而没有明确的增量变更操作类型及其规则,业务操作是直接更新业务对象,也就没有Request以及Response对象;同时此类业务系统的Transaction对象也通常不存在;
Domain Model的级别:
但不论是那种类型对象,都拥有一个属性,对象等级;对于保险系统来说,保单对象,产品对象以及组织对象是一级对象,而险种和角色等都是二级对象;这点对于设计Repository以及服务粒度都有影响。
关于VO对象的讨论:
VO对象是一种技术类型对象,存在于Web,Domain等层次,其存在的意义是提供集成能力;其意义是:1. 保护系统的信息边界,提供一种结构可以使其它系统或者组件通过编码方式获取系统内信息的方式;2. 保护系统的事务边界,领域对象技术上携带着持久化信息,通过VO可以屏蔽得以屏蔽。常见的VO对象存在于Web层和Domain层。
因此,VO对象的存在只是为了集成而存在,其是否存在的取决于两个方面:框架提供的事务边界以及对象路径访问能力。
Domain层VO对象,通常是用于不同Domain组件间的访问。但随着架构的改进,集成代码独立存在,而不再嵌入到组件内部,组件的边界问题保护不复存在;更进一步的是,框架提供自动化的接口适配映射能力的增强。因而VO对象也失去存在的意义。
Web层VO对象,以SWF为例,早在SWF 1.x时代,框架就提供了丰富的对象路径访问能力,但其Web交互是典型的MVC2方式,事务边界在view的render前关闭,因而导致需要特定的VO对象来避免持久化信息问题;而SWF 2.x时代,view的render是在事务边界内,VO不再需要。