回顾:
在一个月前,我们刚刚回顾了面对象至关重要的部分:委托,具体请移步我们博客:面向对象——一起来复习委托与事件!关于这篇博客的具体内容,不再赘述,在这里我们主要讨论在工作流中的应用及他的具体如何解耦我们的业务,界面!
对比:
普通实现:
工作流的理想实现:
认真观察我们发现,状态信息有工作流自带的持久层维护,我们要做的和下文章的自然就变成了调用逻辑,在这一层,怎么解耦,就提上了日程,结果我们发现,解决这个问题,非委托不能胜任!具体的情况呢,请大家先看代码:
代码示例:
<span style="font-size:18px;"> public delegate T DelegateEvent<T>(T message); public sealed class CodeActivityevent<T> : CodeActivity { /// <summary> /// 传入参数,案件实体 /// </summary> public InArgument<T> CaseIn { get; set; } public InArgument<DelegateEvent<T>> WFEventIn { get; set; } /// <summary> /// 传出参数,案件实体 /// </summary> public OutArgument<T> CaseOut { get; set; } /// <summary> /// 执行创建案件 /// </summary> /// <param name="context"></param> protected override void Execute(CodeActivityContext context) { //获取传入参数的两种方法 T CaseUse = CaseIn.Get<T>(context); DelegateEvent<T> WFEvent = WFEventIn.Get<DelegateEvent<T>>(context); CaseUse = context.GetValue(this.CaseIn); //调用业务逻辑层,将获取的实体传入,接收返回的实体,并将其付给传出参数 //TODO:基础活动:修改实体的逻辑层 //返回的案件实体CaseBack T CaseBack = WFEvent(CaseUse); //将返回的实体传出 //CaseOut.Set(context, info); context.SetValue(CaseOut, CaseBack); } }</span>
关键代码:
1,
<span style="font-size:18px;"> public delegate T DelegateEvent<T>(T message);</span>
2,
<span style="font-size:18px;">DelegateEvent<T> WFEvent = WFEventIn.Get<DelegateEvent<T>>(context);</span>
<span style="font-size:18px;"> //返回的案件实体CaseBack T CaseBack = WFEvent(CaseUse);</span>
有了这些代码我们就可在设计工作流界面配置具体的操作,而操作在具体的类中并不写死,传入的方法是什么就是什么!
配置实现:
总结:
使用泛型后,具体执行方法也和前台进行了解耦,在显示层我们剩余的工作,就是收集数据,传入工作流,剩余的工作交予工作流处理,而工作流是我们配置出来的,通过配置工作流生成xml做到业务逻辑的灵活变动和扩展的实现,但是什么样的抽象都是有限制的,抽象的粒度是要均衡的,经我们研究,对节点的抽象,及部分公共流程的抽象,是我们可以控制的范围之内,这样我们就可以尽量适应客户的变化!
经过这一系列的抽象,我们发现,我们开发的工作流,已经脱离了我们当初简单使用的范畴,通过对泛型,委托的技术积累,我们对任何业务的抽象,都那么水到渠成,这时,我认识到一个道理,我们重要的不仅仅是了解更多的技术,还有对技术应用场景的深入剖析,和面向对象认识的提升!
时间: 2024-10-10 04:58:05