当前位置: 首页 > news >正文

创建自己的业务流程管理框架

对于以项目为主的公司来说,最想解决的就是在面对每个业务类似的项目时,如何最大程度的复用以前的代码,使得以后的开发成本降到最低,所以,每个公司,都想拥有自己的一套类似“银弹”性质的框架。对于用友、金蝶这样的规模大的公司来说,他们都有自己的系统架构师和业务架构师一起合作,做出一套公共接口,方便自己的合作伙伴和自己的业务人员二次实施和开发。对于绝大部分实力很弱的中小企业来讲,学习使用Spring则是他们的首选了。但是Spring毕竟只是通用的框架,并且Spring使得你面向接口编程,使得代码和实现相分离的的同时,你也不得不依赖于Spring自己的接口,架构不好的话,自己的所有代码,几乎到处都充斥着Spring相关的类和接口,即使如此,面对一个这样的问题:一个销售出库单,有的客户是不形成应收账款,直接现金交易,一手交钱,一手交货,而有的客户是货到付款,或者在京东商城、当当网这样的商城上卖东西,有几周甚至几个月的账期,肯定是形成自己的应收账款的,甚至一个客户本身,有的商品是销售后有应收账款,而有的没有,怎么办?这种和业务密切相关的业务流程管理框架,是Spring解决不了的。下面我们就详细谈谈如何打造自己的业务流程管理框架,使得业务流程“插件式无侵入”按照顺序执行。

例如:对于一个以MIS系统为主的产品或者项目,比较郁闷的一件事情就是每个业务之间的高度耦合。比如:在一个连锁超市为核心业务的作业系统当中,每家连锁店,最简单的下采购订单业务,都会有门店增减额度(定金)、增减商品在途数量、生成对账单之类的业务交织在一起。我们对付这类高耦合的业务通常的办法就是弄一个所谓的Façade门面设计模式。本人有十几年MIS系统开发经验,1996年大学刚刚毕业,就被分配到天津的一个老牌的军工厂,做他们的医药费报销系统,当时在几个同事的努力下,居然也做出来了,而且还做得像模像样。从那时起,我就对MIS系统各个业务之间的高耦合深恶痛绝,却也毫无办法。十几年了,大家都是这么过来的。

我做Eclipse插件开发,也做了好几年了,架构上,深深被Eclipse插件机制所迷住。如果每个业务之间,也能用插件机制,把以前紧紧耦合的业务逻辑松散一下啊?就像Spring的控制反转(IOC)一样?那该多好啊。

基于这个思路,我就根据目前的需求,做了一个这样的框架。还是让我们先看一个简单的实际例子吧。

<url-mapping action="savecart.action" description="订单存盘" view="index.action"

class="com.softbnd.jetblue.saas.eshop.ecshop.action.CreateCartAction">

<businessprocess description="订单存盘">

<component name="CreatePurchaseOrder" step="1" description="新增商品订单" class="com.softbnd.jetblue.saas.eshop.ecshop.action.CreatePurchaseOrderAction"/>

</businessprocess>

</url-mapping>

这是一个最简单的业务耦合的例子,只有两个业务操作,一个是新增销售出库,一个是新增采购入库。业务背景是这样的:

这个需求是针对商家对商家来的,既B2B的需求。当一个网上用户下了采购订单,这个网上用户也是一个采购商,在网上下自己订单的时候,网上平台本身多了一张销售出库单,既是CreateCartAction干的事情,而对于采购商来讲,他自己本身又多了一张采购订单,也即CreatePurchaseOrderAction干的事情。我们通过businessprocess标签,把相对紧密耦合的两件事情,通过XML配置文件分成了相对独立的两部分。类(CreateCartAction)和类(CreatePurchaseOrderAction)之间互相独立,彼此在代码这一层,没有任何关系,也没有互相依赖。当然,他们在逻辑上,是有紧密联系的,我们可以通过自己的业务TabeObject对象,在两个类之间作为参数传递。

序列图如下所示:

相关文章:

  • 创业有感
  • 《爬梯子的故事》
  • 小故事:金钱的是是非非
  • 谁将在开放平台中受益?
  • 创业者的N中分类
  • 关于淘宝API taobao.item.quantity.update 调用错误分析
  • spring.net 分布式事务 实现方式 多数据库并发访问下 服务层 事务管理 .net下事务管理...
  • git常用操作教程
  • 开源2D游戏引擎(JavaAndroid),LGame-0.3.2版正式发布
  • Windows内存原理与内存管理
  • CruiseControl.NET : Email Publisher cc.net mail 配置(建议初学者必看)
  • 从 中文分词 展开的 胡思乱想
  • 敏捷开发,持续集成 CruiseControl.NET 自动发布 我的一点小实践 其中配置文件替换部分挺重要...
  • 续接上篇 cc.net 自动发布web应用程序 配置文件的替换
  • 敏捷开发,持续集成 fxcop 在 CruiseControl.NET中的使用
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • AWS实战 - 利用IAM对S3做访问控制
  • FineReport中如何实现自动滚屏效果
  • Gradle 5.0 正式版发布
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • k8s如何管理Pod
  • KMP算法及优化
  • k个最大的数及变种小结
  • LeetCode18.四数之和 JavaScript
  • Promise面试题2实现异步串行执行
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • React中的“虫洞”——Context
  • Vue2.x学习三:事件处理生命周期钩子
  • 高性能JavaScript阅读简记(三)
  • 简单基于spring的redis配置(单机和集群模式)
  • 判断客户端类型,Android,iOS,PC
  • 七牛云假注销小指南
  • 设计模式走一遍---观察者模式
  • 微信开放平台全网发布【失败】的几点排查方法
  • 优秀架构师必须掌握的架构思维
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 进程与线程(三)——进程/线程间通信
  • ​HTTP与HTTPS:网络通信的安全卫士
  • #传输# #传输数据判断#
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转载)OpenStack Hacker养成指南
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • .htaccess配置常用技巧
  • .NET : 在VS2008中计算代码度量值
  • .NET Project Open Day(2011.11.13)
  • .net Stream篇(六)
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • @ModelAttribute使用详解