笔者自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
Silverlight
Flash
查找100万以内
单线程:0 .423 秒
单线程:0 .423 秒
双线程: 0.267 秒
1.335秒
查找1000万以内
单线程 9.833秒
单线程 9.833秒
双线程: 6.144 秒
35.62秒
在线测试及源代码下载地址:http://www.itwriting.com/primetest
测试二:UI性能测试,使用小球碰撞模拟
测试项目
Silverlight2
Silverlight 3(cached)
Flash
Flash(cached)
Silverlight2
Silverlight 3(cached)
Flash
Flash(cached)
16个小球
238FPS
116FPS
64FPS
64FPS
238FPS
116FPS
64FPS
64FPS
32个小球
133FPS
112FPS
54FPS
64FPS
133FPS
112FPS
54FPS
64FPS
64个小球
62FPS
107FPS
41FPS
64FPS
62FPS
107FPS
41FPS
64FPS
128个小球
35FPS
99FPS
18FPS
57FPS
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)
丰富的原生控件(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操作类库
.Net Framework多种基本类库支持,包括多线程类库(System.Threading),安全类库(System.Security),反射类库(System.Reflection),Linq类库(System.Linq),数据流操作类库(System.IO),XML操作类库
通讯层
包括ADO.Net交互类库(System.Data.Services),WCF交互类库(System.ServiceModel),网络类库(System.Net )等等
包括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年之痒后,春天是否真的要来了,我们拭目以待!