回想:
在一个月前,我们刚刚回想了面对象至关重要的部分:托付,详细请移步我们博客:面向对象——一起来复习托付与事件!关于这篇博客的详细内容,不再赘述,在这里我们主要讨论在工作流中的应用及他的详细怎样解耦我们的业务,界面!
对照:
普通实现:
工作流的理想实现:
认真观察我们发现,状态信息有工作流自带的持久层维护,我们要做的和下文章的自然就变成了调用逻辑,在这一层,怎么解耦,就提上了日程,结果我们发现,解决问题,非托付不能胜任!详细的情况呢,请大家先看代码:
代码演示样例:
<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做到业务逻辑的灵活变动和扩展的实现,可是什么样的抽象都是有限制的,抽象的粒度是要均衡的,经我们研究,对节点的抽象,及部分公共流程的抽象,是我们能够控制的范围之内,这样我们就能够尽量适应客户的变化!
经过这一系列的抽象,我们发现,我们开发的工作流,已经脱离了我们当初简单使用的范畴,通过对泛型,托付的技术积累,我们对不论什么业务的抽象,都那么水到渠成,这时,我认识到一个道理,我们重要的不不过了解很多其它的技术,还有对技术应用场景的深入剖析,和面向对象认识的提升!