2011年(6)
分类: Java
2011-07-12 09:01:21
对于以项目为主的公司来说,最想解决的就是在面对每个业务类似的项目时,如何最大程度的复用以前的代码,使得以后的开发成本降到最低,所以,每个公司,都想拥有自己的一套类似“银弹”性质的框架。对于用友、金蝶这样的规模大的公司来说,他们都有自己的系统架构师和业务架构师一起合作,做出一套公共接口,方便自己的合作伙伴和自己的业务人员二次实施和开发。对于绝大部分实力很弱的中小企业来讲,学习使用Spring则是他们的首选了。但是Spring毕竟只是通用的框架,并且Spring使得你面向接口编程,使得代码和实现相分离的的同时,你也不得不依赖于Spring自己的接口,架构不好的话,自己的所有代码,几乎到处都充斥着Spring相关的类和接口,即使如此,面对一个这样的问题:一个销售出库单,有的客户是不形成应收账款,直接现金交易,一手交钱,一手交货,而有的客户是货到付款,或者在京东商城、当当网这样的商城上卖东西,有几周甚至几个月的账期,肯定是形成自己的应收账款的,甚至一个客户本身,有的商品是销售后有应收账款,而有的没有,怎么办?这种和业务密切相关的业务流程管理框架,是Spring解决不了的。下面我们就详细谈谈如何打造自己的业务流程管理框架,使得业务流程“插件式无侵入”按照顺序执行。
例如:对于一个以MIS系统为主的产品或者项目,比较郁闷的一件事情就是每个业务之间的高度耦合。比如:在一个连锁超市为核心业务的作业系统当中,每家连锁店,最简单的下采购订单业务,都会有门店增减额度(定金)、增减商品在途数量、生成对账单之类的业务交织在一起。我们对付这类高耦合的业务通常的办法就是弄一个所谓的Façade门面设计模式。本人有十几年MIS系统开发经验,1996年大学刚刚毕业,就被分配到天津的一个老牌的军工厂,做他们的医药费报销系统,当时在几个同事的努力下,居然也做出来了,而且还做得像模像样。从那时起,我就对MIS系统各个业务之间的高耦合深恶痛绝,却也毫无办法。十几年了,大家都是这么过来的。
我做Eclipse插件开发,也做了好几年了,架构上,深深被Eclipse插件机制所迷住。如果每个业务之间,也能用插件机制,把以前紧紧耦合的业务逻辑松散一下啊?就像Spring的控制反转(IOC)一样?那该多好啊。
基于这个思路,我就根据目前的需求,做了一个这样的框架。还是让我们先看一个简单的实际例子吧。
class="com.softbnd.jetblue.saas.eshop.ecshop.action.CreateCartAction">
这是一个最简单的业务耦合的例子,只有两个业务操作,一个是新增销售出库,一个是新增采购入库。业务背景是这样的:
这个需求是针对商家对商家来的,既B2B的需求。当一个网上用户下了采购订单,这个网上用户也是一个采购商,在网上下自己订单的时候,网上平台本身多了一张销售出库单,既是CreateCartAction干的事情,而对于采购商来讲,他自己本身又多了一张采购订单,也即CreatePurchaseOrderAction干的事情。我们通过businessprocess标签,把相对紧密耦合的两件事情,通过XML配置文件分成了相对独立的两部分。类(CreateCartAction)和类(CreatePurchaseOrderAction)之间互相独立,彼此在代码这一层,没有任何关系,也没有互相依赖。当然,他们在逻辑上,是有紧密联系的,我们可以通过自己的业务TabeObject对象,在两个类之间作为参数传递。
序列图如下所示: