Dorado 5 : 5.11.MarmotDataset (RF1)

基于Struts、WebWork、Spring、Hibernate、iBatis等开源框架的开发模式正被越来越多的开发商所接受。也越来越成为给各软件开发商的主流系统架构。MarmotDataset属于Marmot框架中一部分,Marmot是开源的。它的主要作用就是为基于Struts、WebWork、Spring、Hibernate、iBatis等开源框架的开发模式提供与Dorado集成的范例性的实现代码。
MarmotDataset主要被用于更好的与spring框架集成。是为了与开发商原有业务架构中集成了spring框架,或采用类似架构的系统架构更无缝的结合在一起。使用MarmotDataset时通常也会使用MarmotUpdateCommand以及MarmotRPCCommand对象配合使用。在之前介绍的各种类型的dataset对象,不是通过定义其sql属性获取数据,就是需要在视图模型实现类或dataset的listener中通过用户自定义的代码实现dataset的数据加载工作。MarmotDataset被设计为可以将数据加载工作交给spring配置的bean来实现。这样我们就可以很容易的利用spring本身强大的IOC,AOP等机制加强对数据加载工作的管理力度。同样使用Marmot开发技术时,通常的数据提交或远程调用也是通过spring中配置的bean实现,这样就可以比较方便的利用spring中的事物管理机制,以及与系统中原有开发技术的整合变的更容易和紧密。
MarmotDataset继承与AbstractDataset,因此具有AbstractDataset的所有功能。
对于MarmotDataset,有2个属性非常重要。
第一个是DataProvider,它的作用是给dataset提供数据。一般是在spring中配置的BeanID。
例如:dataProvider的值对应Spring配置文件中的BeanID。

图表 57

<bean id="employeeDataProvider" class="sample.view.EmployeeDataProvider">
<property name="employeeManager">
<ref bean="employeeManager"/>
</property>
</bean>

第二个是ObjectClazz ,它的作用是告诉dataset需要处理什么样的数据类型。
例如:此处处理的是Employee对象。

图表 58
还有一个常用的属性 method,这个属性可以实现方法分派。
如前面所介绍的每次新增一个Class,实现上面的某个接口,并在execute方法中填入自己的代码。但是有些技术人员可能不太喜欢这种方式,因为它会会产生大量的Class。我们几乎要为每一个Dorado中的Dataset和提交动作新建一个Class,这可能会造成配置和管理这些Class的负担加重。我们利用属性 method实现方法分派来减少文件数量。
例如:method的值对应dataProvider中的方法名。

图表 59

public void getEmployee(DataSet dataSet)
throws Exception {
Map parameters = (Map) dataSet.getParameters();
String id = (String) (parameters).get("id");
Employee employee = employeeManager.getEmployee(id);
if (employee != null) {
dataSet.addRecord(employee);
}
}

注意:方法分派会破坏DataProvider等接口原本的面向对象的设计思想。因此,在使用方法分派我们可以不必实现这些接口。不过,如果您将方法名定义为execute,Marmot会认为你希望严格的遵循接口的设计思想,此时Marmot会尝试对这个类做强类型转换,这意味着这种情况下这个类必须实现Marmot提供的接口。所以,我们不建议您将方法命名为execute。

Marmot中最重要的两个概念就是DataProvider和DataResolver。这两个对象的作用的相对的,DataProvider用于为Dorado中的Dataset提供数据,DataResolver用于处理Dorado客户端提交的数据。在Marmot中Dorado与后台业务逻辑层的数据交换主要通过这两个接口的派生类来完成。
在DataProvider和DataResolver的方法参数当中我们总是可以看到一个DataSet对象,该对象并不是Dorado中的Dataset(注意名称中的字母大小写),Marmot中的DataSet可以看作是Dataset的轻量级抽象,Marmot中提供DataSet的目的是为了避免跟Dorado产生过度耦合。尽管Marmot中目前只有针对Dorado的实现,但理论上Marmot的DataSet也可以用于封装其他表现层框架中的数据载体。
DataSet的主要作用是管理一组数据对象(一般是POJO对象),它的作用有点类似与集合对象,不同的是它可以管理其中每个对象的状态。这里所说的状态是指对象的编辑状态,包含以下4种:
UNCHANGE 未改变。表示该对象中的数据尚未发生过任何变化。
NEW 新增状态。表示该对象是新增的,当该对象最终在执行持久化操作时将进行新增的操作。
MODIFIED 被修改。表示该对象中的数据已被更新,当该对象最终在执行持久化操作时将进行更新的操作。
DELETED 被删除。表示该对象中的数据已被标记为删除,当该对象最终在执行持久化操作时将进行删除的操作。
关于DataSet的主要方法,说明介绍以及更深入的了解Marmot,请参考《Marmot入门指南》。