天天看点

cdoframework系列介绍4:通用事务调用接口

 cdoframework的官方网站:http://www.cdoframework.com

  一个业务对象的事务调用接口,目前通行的做法是为每一个事务定义一个特定的方法,如果一个对象实现了多个事务,则会定义出多个方法。下面的例子说明了这一点:

public interface EmployeeManager { int addEmployee(Employee emp); int modifyEmployee(Employee emp); int deleteEmployee(String employeeId); }

  CDO开发框架认为,事务执行的本质是数据交换。一个事务(或者一个方法)的执行过程,其实是输入请求数据,输出应答数据的过程。同时,我们还要知道事务的执行成功与否。此外,事务行为,即方法名,CDO应用开发框架也视其为请求数据的一部分,这样,任何一个事务,都可以统一为包含请求数据,应答数据和执行结果的执行过程,可定义为:

  Return handleTrans(CDO cdoRequest,CDO cdoResponse)

  完整的事务对象的接口定义如下:

public interface ITransService { Return init(); void destroy(); Return handleTrans(CDO cdoRequest,CDO cdoResponse); }

  在handleTrans方法中,cdoRequest表示请求数据,cdoResponse表示应答数据,Return代表执行结果。

  通用事务调用接口的一个显而易见的好处是,我们无需为不同的业务对象定义不同的接口(不用再编写接口定义文件了),事务方法的变更不会影响接口定义。

更为重要的是,由于所有业务对象的事务接口统一了,我们就可以以一种通用的方式实现各事务的业务逻辑。通过可以提供一个服务总线对象,把事务对象转换成和该服务总线对象相连接的一个服务对象。每个服务对象之间的调用不再通过相互引用达成,而是各自仅仅和总线对象相关,各服务对象之间将完全没有代码上的耦合,一个服务对象对另一个服务对象的调用,完全是透明地通过服务总线对象进行的。下图的黄色部分即代表服务总线。

cdoframework系列介绍4:通用事务调用接口

2.利用handleTrans实现通用事务调用接口

  像上面的EmployeeManager接口的三个方法,可以统一用handleTrans来代替。其中:

  1) cdoRequest为请求对象,保存事务的请求参数等信息。请求对象中通过strServiceName和strTransName组合作为Key区分不同的事务,其值为对应的事务名,比如下面的代码填充了一个请求对象:

cdoRequest.setStringValue(“strServiceName”,” EmployeeService”); cdoRequest.setStringValue(“strTransName”,”addEmployee”); cdoRequest.setStringValue(“strName”,”张三”); cdoRequest.setIntegerValue(“nAge”,20); //…

  2) cdoResponse为应答对象,保存事务执行的输出,如果没有输出,可以不填充;

  3) Return为返回对象,保存事务的执行结果

  在handleTrans内部,再根据strServiceName和strTransName的值,执行对应的某个具体方法。如果某个事务是handleTrans所不应该处理的,则handleTrans返回null,以表示未对该事务进行处理。

  这种方式在统一了方法定义的同时,还利用CDO对象的优势,避免了开发诸如Employee这样的数据类。