案例分析:Silverlight在中国人寿的应用
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年之痒后,春天是否真的要来了,我们拭目以待!