案例分析:Silverlight在中国人寿的应用

2010 年 5 月 31 日

笔者自 2003 年首次听到 Macromedia 公司提起 RIA(富互联网应用)一词到现在整整 7 年了。一度被认为是互联网应用趋势的 RIA 经历了 7 年之痒,但仍然没有在互联网上得到大规模普及,特别是企业应用就更加少见。做个不恰当的比喻,传统基于 Html 的应用就像互联网应用中的绿叶一样,而 RIA 技术由于酷炫的用户体验效果就像是美丽的花朵。现在开心网和腾讯 QQ 等商业应用中已经运用了 RIA 技术在其社交网站中得到应用,但这毕竟还是少数,大多数互联网应用特别是企业级应用仍然选择传统高稳定性与高响应能力的 Html 应用路线,那未来的互联网应用,特别是企业应用能够迎来 RIA 的春天,绽放出漫山遍野的花朵呢?

(图片摄于笔者家乡–成都)

还记得 2000 年刚接触 Flash 开发,发现 ActionScript 可以通过面向对象的方式实现 MIS 系统应用,但 Macromedia 公司对 Flash 的定位仍然是面向设计人员,在面向开发方面的进展不得不用缓慢来形容,直到 2004 年在被 Adobe 公司收购的头一年才真正意义上推出了面向开发者的 Flex 1.0 版本。笔者虽然对当时 FLEX Store 应用所振奋,但很快发现其第一个版本在大数据量下低迷的表现。而 Flash+AS 和 FLEX 这两条路线,使得开发者很难去抉择。当我还在一边看着 LUAR 编写的《Flash MX 2004 ActionScript 2.0 与RIA 应用程序开发》,LUAR 本人却在博客上发表了《Flash 未来未有来》的文章,作为中国Flash 应用开发的领军人物,主动得出"Flash 没有帮助开发者开发RIA"的结论。当然现在的Flash 经过10 年的苦心经营,应用已经非常广泛,特别是在一些Web 页面的应用上面。

RIA 技术选型

2008 年,中国人寿养老保险公司提出开发面向企业客户的养老金精算咨询系统(PACS),但由于养老金咨询中的方案数据采集与精算过程非常复杂,使用传统 B/S 架构很难实现。由于多年来的 RIA 开发经历,作为项目经理的我提出在此项目中尝试使用 RIA 技术进行开发,以到达客户友好性与易用性的目的。微软发布一年的 Silverlight 引起了项目组的注意,由于企业 B/S 开发的两大阵营,一个是 Java,另一个是.NET 平台。针对主流 RIA 技术笔者进行了对比,当时 Java 平台的 JavaFX 仍然处于 beta 阶段,而在此前笔者已经在一些项目中运用了 ExtJS 等通过 JS 实现的类 RIA 应用,但实际开发效率较低,而且脚本出错概率较高,JS 调试相对困难,企业架构要求的稳定性得不到很好的保障。因此,我们将目光集中在了.NET 框架下的 Silverlight 上,经过与微软中国的多次沟通交流,并进行了必要的性能测试。以下是通过实际测试当中的性能对比(对比基准为 Flash):

测试一:后台运算性能测试,使用相同的素数查找算法

测试项目

Silverlight

Flash

查找 100 万以内

单线程:0 .423 秒

双线程: 0.267 秒

1.335 秒

查找 1000 万以内

单线程 9.833 秒

双线程: 6.144 秒

35.62 秒

在线测试及源代码下载地址: http://www.itwriting.com/primetest

测试二:UI 性能测试,使用小球碰撞模拟

测试项目

Silverlight2

Silverlight 3(cached)

Flash

Flash(cached)

16**** 个小球

238FPS

116FPS

64FPS

64FPS

32**** 个小球

133FPS

112FPS

54FPS

64FPS

64**** 个小球

62FPS

107FPS

41FPS

64FPS

128**** 个小球

35FPS

99FPS

18FPS

57FPS

在线测试及源代码下载地址: http://bubblemark.com

注:在最新公布的 Silverlight 4.0 中,官方指出 UI 线程性能提升了 5.5 倍,Worker 线程处理性能提高 870 倍。

这里要特别说明一个问题,Silverlight 与 Flash 本身的运行时都在客户端,以前我也在 Silverlight 发布会中提出 Silverlight 后台语言支持能力更强,但被很多人误认为是服务器端语言,其实 Silverlight 与 Flash 一样可以通过多种网络协议连接不同技术架构的服务端程序,但就客户端的运行时来说,Silverlight 是基于.NET 的 JIT Compiler 的,而且有 CLR 基础类库支持,所以与 Flash 前端运行时有很大差别。

Silverlight 实现 RIA 端到端的优势

谈到微软专门为 Silverlight 包装的 Core CLR 运行时环境,就不得不说到整个.NET 框架的优势,很多人将.NET CLR 与 JRE 做比较,两者都具有相当强大的基础类库支持,可以说为企业开发提供了基础,而 Silverlight 享受到了这样的基础类库,但为了减小运行时文件大小,提高用户下载安装体验,微软去除了无用的服务器端基类,保留了主要的客户端类库,下面我将结合 Core CLR 来说明 Silverlight 在企业级开发中的优劣势。

下表是笔者总结的在企业级应用开发方面 Silverlight 的优势:

其中最为重要的一点就是前端 Core CLR 的支持,大家可以参见 MSDN 来获得 Silverlight 4 基础类库的全部资料

本文不会对 CoreCLR 做过多介绍,结合客户端架构将 Silverlight 主要基础类库总结如下:

层次

基类库支持程度

XAML**** 表现层

丰富的原生控件(System.Windows.Controls 超过 100 种控件类)与自定义控件库( System.Windows.Controls. UserControl),支持全局样式修改与资源管理 (System.Resources),支持动画 (System.Windows.Media.Animation),效果(System.Windows.Media.Effects)

客户端控制逻辑层

.Net Framework 多种基本类库支持,包括多线程类库(System.Threading),安全类库(System.Security),反射类库(System.Reflection),Linq 类库(System.Linq),数据流操作类库(System.IO),XML 操作类库

通讯层

包括 ADO.Net 交互类库(System.Data.Services),WCF 交互类库(System.ServiceModel),网络类库(System.Net )等等

而使我们选择 Silverlight 的另外一点是,结合.NET 服务器端技术,可以在一个技术体系下构建端到端的 RIA 应用,在开发上由于语言的一致性可以共享类库,而同样的 IDE 环境能够提供方便的前后端一体化调试功能等功能。

通过 Silverlight 如何加强数据展现能力

要构建企业级应用,就必须要使得数据的展现和编辑更加方便直观,传统基于 HTML 标签语言的 web 应用,可以通过 input 和 Table 等来实现数据编辑与展现,但无法超出其能力之外,很多第三方的 Web 应用控件都是利用 JS 脚本来实现排序,拖拽等效果,但脚本语言毕竟是低效的,并且具有许多外部原因(如浏览器环境等)使得其稳定性不高,而 Silverlight 原生的控件在数据展现与编辑上面具有良好的表现。以 PACS 系统中的数据列表为例,使用 Silverlight 的 DataGrid 控件,原生支持列排序,列拖拽,也可以通过代码实现过滤,分页。由于我们在一些应用场景中需要对每一条记录都有对应的处理流程和功能按钮,因此使用 DataGrid 控件中定义行模板(DataGrid.RowDetailsTemplate)就可以实现自定义行样式的效果。而在 < DataTemplate /> 中你可以加入任何 XAML 元素,使得 Silverlight 应用可以简单快速的实现以前难于实现的效果。

当然除了数据列表的展现方式,Silverlight 提供更多的图形化展现方式,比如原生的各种统计图表,以下是 Silverlight 的 Chart 控件应用,在拖动各种参数时,图表将以动画形式变换,而不需要写任何代码。

Silverlight Do It in Naturally

除数据展示以外,在传统 WEB 应用中,可能会遇到更多的数据录入上的限制,比如一种分段设置参数的应用场景,当我们要输入任意年龄段的对应参数时,传统 Web 应用没有好的解决方案,可能只会通过下面的方式来进行数据录入:

但如果使用 Silverlight 自定义控件就可以实现如下更加人性化的设计:

通过点击就可以简单实现在分段的中间插入分段,拖拽就能删除分段,这样的设计符合"do it naturally"用户体验设计原则。而且 Silverlight"一切皆为用户控件"的思路,使得开发者可以很简单的开发一个用户控件,而且这些用户控件可以被整个项目充分复用。

"体验先行"的开发流程

Silverlight 基于"体验先行"的设计,颠覆了传统业务需求模式,改变传统开发流程,是开发团队可以选择以界面而非功能为起点的开发模式。在 PACS 项目需求分析中,我们没有采用需求规格说明书面向功能的阐述方法,因为业务与 IT 的认识隔阂往往会导致项目失败。在 Silverlight 设计工具 Blend 中包含了原型开发工具 SketchFlow,通过简单的原型控件拖拽就可以快速开发系统原型,使得业务部门迅速理解界面与逻辑关系,避免了业务与 IT 在最终交付物认识上的差异。以下是 PACS 在需求分析过程中的原型与最终系统截图对比:

Silverlight 在 PACS 开发中带来了开发过程的革命,经过最终评估,采用快速原型的方式大大减少了需求变更,确保了业务满意度。

展望未来

展望 Silverlight 技术未来发展,在刚刚结束 MIX10 大会上,微软已经将 Silverlight 定位为未来 Windows Mobile 的主要开发技术,加之以前在跨浏览器,跨平台的策略,实际上已经实现"手机、PC、电视"三屏合一,可以很清晰地看到微软有使用 Silverlight 实现客户端应用大统一,从而全面收复 Web 应用失地的趋势。因此,未来微软肯定还会不断加大此项技术的认知度,而 Adobe 公司不会放弃通过占有率全面反击的机会。这也是我们作为企业开发者希望看到的竞争态势,那么 RIA 在经历 7 年之痒后,春天是否真的要来了,我们拭目以待!

(免责申明:本文仅代表作者个人观点)


作者简介:吴磊,就职于中国人寿,曾获得系统分析师、PMP、MCSE 等认证。2003 年毕业之后就职于中国人寿,一直从事开发工作,担任过软件开发人员、软件设计师、项目经理、软件架构师。

此文章被收录在《架构师》(5 月刊)

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家加入到 InfoQ 中文站用户讨论组中与我们的编辑和其他读者朋友交流。

2010 年 5 月 31 日 20:457373

评论

发布
暂无评论
发现更多内容

论“万剑归宗”思想对开发设计的一点“肤浅”作用

八苦-瞿昙

随笔杂谈 设计实践

为什么说应用架构需要分类思维?

Java架构师迁哥

Alibaba官方发文:阿里技术人的成长路径与方法论

Java架构师迁哥

面试者必看:Java8中的默认方法

Silently9527

java8 默认方法

都是“算法”惹的祸,字节三面处处坑,我的offer要凉了?

马士兵老师

字节跳动 编程语言 算法和数据结构 面试数据结构与算法

区块链、AI与大数据加持,电子合同更安全、效率更高

CECBC区块链专委会

区块链 大数据

Java踩坑记系列之BigDecimal

Java老k

BigDecimal

一期二班-吴水金-第六课作业

吴水金

架构师训练营 W06 作业

Geek_f06ede

家庭留白、中屏崛起与硬件棋局

脑极体

架构师训练营 - 第五周学习总结

joshuamai

区块链医疗应用场景有哪些?区块链医疗解决方案

13530558032

智慧警务大数据可视化平台智慧公安警务研判系统开发

13530558032

Java踩坑记系列之Arrays.AsList

Java老k

Java

“奋斗者”号下潜10909米:我们为什么要做深海探索?

脑极体

智慧园区管理平台app系统开发,智慧楼宇系统搭建

13530558032

mongodb 源码实现系列 - command命令处理模块源码实现一

杨亚洲(专注mongodb及高性能中间件)

MySQL mongodb 高性能 源码剖析 分布式数据库mongodb

数字人民币快来了,但多数人可能会有四大误解

CECBC区块链专委会

数字人民币

IPFS四币连发系统开发技术(四币循环模式)

薇電13242772558

区块链 数字货币

计算机核心课程必读书目——《高级数据结构:理论与应用》

计算机与AI

数据结构 算法

甲方日常 57

句子

工作 随笔杂谈 日常

开源认证和访问控制的利器keycloak使用简介

程序那些事

程序那些事 授权框架 开源认证框架 keycloak 认证授权

java: Compilation failed: internal java compiler error解决办法

LSJ

IDEA

数字经济发展势头强劲

CECBC区块链专委会

数字经济

区块链防伪溯源平台搭建,助力企业品牌安全体系升级

13530558032

架构师训练营 - 第五周课后练习

joshuamai

JVM-技术专题-垃圾回收策略

李浩宇/Alex

熬夜不睡觉整理ELK技术文档,从此摆脱靠百度的工作(附源码)

996小迁

Java 编程 架构 面试 ELK

Thread.start() ,它是怎么让线程启动的呢?

小傅哥

Java 线程 JVM 小傅哥 Thread

Alibaba最新《Java架构核心宝典》限时开放下载,互联网主流技术详解总结,提升技术能力的必备宝典!

Java架构之路

Java 程序员 架构 面试 编程语言

Architecture Phase1 Week10:Summarize

phylony-lu

极客大学架构师训练营

案例分析:Silverlight在中国人寿的应用-InfoQ