WF4.0——升级技能:泛型应用

前提:

在项目的开发中,我们知道,加入泛型,通过对类型的封装,进行抽象后,可以大大减少我们代码量,在项目中,泛型可以说是高级工程师必备的技能之一,也是面向对象的核心“抽象”的技术基础之一,他这么牛,在工作流的开发中,我们不免就要考虑!

还有一个技术,也是一个重要的内容,就是委托,在项目中,我们通过委托可以对层级之间,对象之间的关系就行解耦,将耦合延迟到运行状态时进行绑定,这样我们就能在改动较为少的前提下对项目的变动作出快速的反应!而在工作流的开发过程中,我们也是要加入的必备技术!(请关注我的下片博客)

原因:

下面给大家介绍我们为什么加入这两种技术的原因:

在普通的工作流开发中,我们在上篇博客中已经介绍过,他造成了一个严重的影响,就是结点太多了!我们看一幅图(实际项目中的例子,很有说服力)

大家认真观察不难发现,我们将近有几十个结点,而这些点的开发将是我们噩梦的开始,我们每个人基本上都会发现,这个结点和其他几个结点只有几个不同的地方,90%都是相似的,而我们却傻傻地写了所有的代码,聪明一点的,还会复制粘贴,但是我们是面向对象的工程师,我们应该有更好的解决方案。

而这时,我们自觉想到了泛型,他就是对类型的抽象,有了它,我们就可以只关心我们特定的逻辑,而根据客户端类型的确定,我们就可以复用公共的逻辑!

代码对比:

一般代码:

<span style="font-size:18px;">public sealed class Activity_ToDo : CodeActivity
    {
        // 定义一个字符串类型的活动输入参数
        public InArgument<Login.Model.Entity.Case> CaseIn { get; set; }
        public OutArgument<Login.Model.Entity.Case> CaseOut { get; set; }

        // 如果活动返回值,则从 CodeActivity<TResult>
        // 派生并从 Execute 方法返回该值。
        protected override void Execute(CodeActivityContext context)
        {
            Login.Model.Entity.Case info = new Login.Model.Entity.Case();

            BaseEntityAbstract cache = new BaseEntityHelper();
            cache.GetTableInfo(typeof(Login.Model.Entity.Case));
            CommonData.Data.Core.SQLCore.SqlHelper sq = new CommonData.Data.Core.SQLCore.SqlHelper();

            info.Id = CaseIn.Get(context).Id;
            info.CaseName = CaseIn.Get(context).CaseName;
            info.State = "正在办理";
            info.InstanceID = CaseIn.Get(context).InstanceID;
            info.UserId = CaseIn.Get(context).UserId;

            sq.Update<Login.Model.Entity.Case>(info);
            info = sq.GetEntity<Login.Model.Entity.Case>("InstanceID", info.InstanceID);

            //CaseOut.Set(context, info);
            context.SetValue(CaseOut, info);
            //Login.Model.Entity.Case caseThisCon = context.GetValue(this.CaseOut);
        }
    }</span>

使用泛型之后的代码:

<span style="font-size:18px;">public sealed class CodeActivityevent<T> : CodeActivity
    {

        /// <summary>
        /// 传入参数,案件实体
        /// </summary>
        public InArgument<T> CaseIn { get; set; }

        /// <summary>
        /// 传出参数,案件实体
        /// </summary>
        public OutArgument<T> CaseOut { get; set; }

        /// <summary>
        /// 执行创建案件
        /// </summary>
        /// <param name="context"></param>
        protected override void Execute(CodeActivityContext context)
        {
			//获取实体操作类
			BaseEntityAbstract cache = new BaseEntityHelper();
            cache.GetTableInfo(typeof(Login.Model.Entity.Case));
            CommonData.Data.Core.SQLCore.SqlHelper sq = new CommonData.Data.Core.SQLCore.SqlHelper();

            //获取传入参数的两种方法
            T CaseUse = CaseIn.Get<T>(context);
            //调用业务逻辑层,将获取的实体传入,接收返回的实体,并将其付给传出参数

            //TODO:基础活动:修改实体的逻辑层
            //返回的案件实体CaseBack
            T CaseBack = sq.Save(CaseUse);

            //将返回的实体传出
            //CaseOut.Set(context, info);
            context.SetValue(CaseOut, CaseBack);

        }
    }</span>

代码对比结果

我们发现使用泛型后有几点好处:

1,代码复用,这样我们多有的保存操作都可以用一个代码活动解决

2,公共服务,我们规定好基本的代码结构后,想要给所有的公共服务增加一个功能,则只需改动一个类就可以

我们又发现了几点工作流的好处:

1,解耦逻辑,在逻辑处理这一层大部分有工作流性质的业务可以使用工作流泽合逻辑处理层,而工作流就是xml文件,所以他的改动是一个解耦行为

2,扩充简单,我们在某一个小型复用工作流中,对其功能的扩充就是开发扩充模块,加入工作流就ok了

总结:

我们使用任何技术,只要这个技术存在的时间够长,我们有理由相信,我们遇到的问题,前人肯定遇到过,他们肯定通过N种方法解决了这种困难,我们要做的就是找到他,研究它,在这个技术基础上先进行公共服务抽象,然后就是具体业务的编写,我们这个过程中,我们的收货,不仅仅是技术的获得,还有抽象理念的提升及面向对象的加深!像老师说,我们要在架构层面上进行开发!

时间: 2024-08-12 04:41:13

WF4.0——升级技能:泛型应用的相关文章

WF4.0——升级技能:委托应用

回顾: 在一个月前,我们刚刚回顾了面对象至关重要的部分:委托,具体请移步我们博客:面向对象--一起来复习委托与事件!关于这篇博客的具体内容,不再赘述,在这里我们主要讨论在工作流中的应用及他的具体如何解耦我们的业务,界面! 对比: 普通实现: 工作流的理想实现: 认真观察我们发现,状态信息有工作流自带的持久层维护,我们要做的和下文章的自然就变成了调用逻辑,在这一层,怎么解耦,就提上了日程,结果我们发现,解决这个问题,非委托不能胜任!具体的情况呢,请大家先看代码: 代码示例: <span style

OkHttpUtils-2.0.0 升级后改名 OkGo,全新完美支持 RxJava,比 Retrofit 更简单易用。

okhttp-OkGo 项目地址:jeasonlzy/okhttp-OkGo 简介:OkHttpUtils-2.0.0 升级后改名 OkGo,全新完美支持 RxJava,比 Retrofit 更简单易用.该库是封装了 okhttp 的网络框架,支持大文件上传下载,上传进度回调,下载进度回调,表单上传(多文件和多参数一起上传),链式调用,可以自定义返回对象,支持 Https 和自签名证书,支持 cookie 的持久化和自动管理,支持四种缓存模式缓存网络数据,支持 301 和 302 重定向,扩展了

day04_oracle版本升级--10.2.0.1.0升级到10.2.0.4.0

软件升级 1.oracle很少升级,除非你要用什么新的功能.因为升级要停库,好多和库相关的组件可能全要升级.升级前一定要开会研究很长时间. 2.一些大公司定期委托第三方公司做<系统安全防护评测>,扫描出一些漏洞时,会要求升级并打补丁[联通] 神州数码信息服务股份有限公司.绿盟科技 如下形式的漏洞: 漏洞详细信息 Oracle数据库Network Foundation组件远程拒绝服务漏洞 详细描述 本次扫描是通过版本进行的,可能发生误报. Oracle Network Foundation是 O

.NET 4.0中的泛型协变和反变

随Visual Studio 2010 CTP亮相的C#4和VB10,虽然在支持语言新特性方面走了相当不一样的两条路:C#着重增加后期绑定和与动态语言相容的若干特性,VB10着重简化语言和提高抽象能力:但是两者都增加了一项功能:泛型类型的协变(covariant)和反变(contravariant).许多人对其了解可能仅限于增加的in/out关键字,而对其诸多特性有所不知.下面我们就对此进行一些详细的解释,帮助大家正确使用该特性. 背景知识:协变和反变 很多人可能不不能很好地理解这些来自于物理和

UiAutomator2.0升级填坑记

UiAutomator2.0升级填坑记 SkySeraph May. 28th 2017 Email:[email protected] 更多精彩请直接访问SkySeraph个人站点:www.skyseraph.com 啰嗦 Google Android Developers 在2015年3月就发布了UiAutomator 2.0版本(下文简称U2),而公司的核心产品中用到还是UiAutomator老版本(下文简称U1),业界用U2的也不是很多,虽然有诸多问题和不便(如高版本OS中不支持Remo

linux内核升级(ubuntu12.04从3.13.0升级到3.4.0 )

花了一天的时间,终于把ubuntu12.04 的linux内核版本从3.13.0升级到3.4.0 升级后,系统更加稳定. 具体步骤:# wget http://www.kernel.org/pub/linux/kernel/v3.x/linux-3.4.tar.gz# tar zxvf linux-3.4.tar.gz -C /usr/src# cd /usr/src/linux-3.4# make menuconfig# make# make modules_install# cp arch/

MetroUICSS 2.0到3.0升级细节记录

Metro UI CSS 是一套用来创建类似于Windows 8 Metro UI风格网站的样式 其官网地址:http://metroui.org.ua/ 中文地址:http://www.bootcss.com/p/metro-ui-css/ 源码地址: https://github.com/olton/Metro-UI-CSS 这种前端框架没有Bootstrap.YUI流行,网上资料也不多.现在项目中用的这框架要从2.0升级到3.0,我在这里记录下各种细节. js包的替换,url的替换 but

Oracle升级_oracle 10g版本由 10.2.0.4.0升级为10.2.0.4.4(即PSU升级)

***************************************************************************************************** 续借上篇:Oracle升级_oracle 10g版本由 10.2.0.1.0升级为10.2.0.4.0(即CPU升级) ***********************************************声明***************************************

jackson2.5.0升级到2.7.0

开发环境:spring-mvc4.1.7.jackson2.7.0 问题描述:项目中将原来的jackson2.5.0升级到2.7.0,导致服务调用出错. mvc相关的配置文件如下: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.