Silverlight 之重
请大家不要觉得奇怪,架构的轻与重永远都是相对而言,虽然Silverlight相对于传统C/S架构有更加轻型的运行时环境,但相较于Html+JavaScript等传统B/S架构确实具有更加庞大的基础类库支持。Silverlight依靠.Net平台,使用C#高级语言代替JavaScript脚本语言,实现了强大的客户端计算能力、支持多线程,继承了WPF丰富的样式、控件、特效与动画,更可控的浏览器适应性,更安全的沙箱模式,客户端嵌入式数据库等,这就是本期要给大家介绍的重点—Silverlight之重。
自上世纪90年代以来,Html+JavaScript几乎占据了Web应用的全部,在近20年的发展过程中,一大批工具化的JavaScript框架应运而生,比如轻量级的JQuery、重量级的ExtJs和Dojo等都为开发者建立Web应用提供了多种选择。 ExtJs框架有强大的UI展现层,已经在Turbo CRM等企业级应用中有实际案例,而Dojo有IBM、Oracle等大公司撑腰,Struts2更将Dojo集成在客户端框架中,该框架甚至还支持离线浏览。
虽然以上框架已经具有相当可观的基础库支持,但Silverlight的架构却拥有更加重量级的高级语言支持,使得它可以完成JavaScript框架所不能实现的功能,Silverlight之重就体现在以下几方面:
· 基于.Net平台,拥有丰富的基础类库支持,可以快速构建复杂的企业级应用
Silverlight拥有强大的.Net平台支持,自Silverlight1.1使用.Net运行时环境以来,Silverlight类库已经得到极大的扩充,并集成了WPF、WCF、LINQ、DLR、COM等.Net平台的优秀技术,下图是MSDN上关于.Net for Silverlight的支持图例。
由于Silverlight使用了WPF展现层控件库,使得Silverlight与WPF共享代码不存在任何技术屏障,事实上Silverlight就是一种桌面应用在Web上的轻量级实现,即便存在一些差异,我们也可以通过下面的代码将Silverlight应用与桌面应用粘合在一起。
#if SILVERLIGHT dynamic excel = AutomationFactory.CreateObject("Excel.Application"); #else dynamic excel = Microsoft.VisualBasic.Interaction.CreateObject("Excel.Application", string.Empty); #endif
目前已经有很多重型的企业级架构实现了Silverlight与WPF共享类库,比如Prism项目。
Silverlight运行时环境目前已经有近千个可供使用的类,而ToolKit与大量的第三方工具程序集可以为Silverlight提供更加强大的后援支持。因此在RIA企业级应用开发过程中,团队可以通过.Net强大的基础库与工具集快速构建出复杂的企业级应用。
· 支持多线程,支持UI线程与后台线程分离,具有更大的性能优势
Silverlight具有彼此分离的UI线程与后台线程,可以将客户端的耗时操作放在后台线程中处理。这样做有两方面的收益:第一,由于没有在UI线程中执行耗时操作,避免了UI线程阻塞,提高了UI响应速度;第二,由于没有将操作放在服务器端运行,减少了网络的调用开销,同时通过使用客户端资源降低服务器端压力。Silverlight多线程可以通过多种方式实现,比如Dispatcher、BackgroundWorker、ThreadPool都可以轻松创建后台线程,并可以通过事件句柄实现线程间异步通信。(敬请期待本专栏第五期《Silverlight的多线程能力》)
· 丰富的服务器端通信能力
目前Silverlight支持TCP、UDP、Socket等网络协议,以及HttpHandler、WebServices等多种应用层协议,还可以通过WCF RIA Service数据“透明”访问方式(通过向客户端公开数据访问层,屏蔽了通信层手工编码)快速实现实体通信。
在原有应用集成方面,如果服务器端使用.Net平台,那么Silverlight客户端程序可以重用原有通信方式,而不必对服务器端程序有较大改动,如果服务器端使用Java平台,Silverlight也提供标准WebServices、Http、Socket多种交互方式进行通信,服务器端只要进行简单的服务封装就可以实现与Silverlight客户端的数据通信。因此,Silverlight基于.Net提供了快速与服务器端程序集成的能力。事实上,在笔者所开发的项目中,已经实现了Silverlight客户端与.Net、J2EE(通过REST接口)、Tuxedo(通过SALT接口)的数据连通性。(敬请期待本专栏第六期《Silverlight与J2EE通信》)
· LINQ语言的支持
LINQ是一种开发高效的声明式语言,开发者通过可以这种类似SQL的语言快速构建数据逻辑,而避免了原有面向对象操作中的复杂过程,当然这只是LINQ的外在表现形式。其实LINQ申明式语言依赖于Lamda表达式,而Lamda表达式的背后是强大的表达式树ExpressionTree,LINQ to Any的真正强大在于将数据逻辑的具体实现方式与书写方式分离开,使开发者使用一种方式就可以访问和操作各种数据对象。而Silverlight集成了LINQ语言,在实际的应用开发中,开发者可以通过更加简单的方式来实现复杂的业务逻辑;另一方面,Silverlight同样集成了强大的表达式树,使得开发者可以通过自行扩展表达式树来构建LINQ To Any的适配器,也可以使用表达式树来构建更加复杂的动态语法和动态LINQ。当然,如果未来微软将PLINQ的并行查询语言集成到Silverlight中,那将使Silverlight的查询性能更近一步。(敬请期待本专栏第七期《Silverlight轻量级查询对比》)
· 客户端嵌入式数据库支持
Silverlight内置IsolatedStorage可以操作独立存储中的数据,但这还不足以实现复杂的数据操作,我们需要在Silverlight项目中引入第三方嵌入式数据库程序集,实德Silverlight可以通过客户端独立存储来建立客户端嵌入式数据库,实现在脱机状态下存储与管理数据。开发者可以通过嵌入式数据库快速构建纯客户端(包括桌面、移动设备等)的信息管理应用,甚至实现基于嵌入式数据库缓存的“云与端”应用。目前支持Silverlight的嵌入式数据库选择已经相当广泛,比如Siaqodb、EffiProz、Perst、Rapid Repository(WP7 DataBase)等都有专门针对Silverlight的嵌入式数据库与管理工具。(敬请期待本专栏第八期《Silverlight嵌入式数据对比》)
· 动态语言支持
Silverlight对动态语言的支持分为:对JavaScript的互操作性、对dynamic动态类型的支持和DLR的集成。
在对JavaScript的互操作性方面,Silverlight可以通过System.Windows.Interop类集将其应用程序中的控件暴露成Html DOM,实现内部控件对外部JavaScript的可见性;Html反向可见性是通过System.Windows.Browser类集来实现的,Silverlight可以与Html对象或者JavaScript对象进行交互。Silverlight中支持dynamic动态类型,允许在运行时动态加载对象。通过Silverlight 集成了动态语言运行时环境DLR,目前支持IronPython、IronRuby、JScript等动态语言在Silverlight应用程序中的执行。
· 与COM的互操作
Silverlight脱浏览器应用(OOB)可以在客户端创建并操作COM对象,比如打开Word、Excel等所有在客户端操作系统中注册的COM组件,Silverlight5甚至允许在浏览器中调用Office COM对象,在OOB模式下更可以调用任何外部Windows应用程序,并支持对USB设备与条形码扫描器等更多外设的API调用。
· 3D引擎与丰富的多媒体控制
Silverlight基础类库包含MediaElement控件,可以在Silverlight程序中控制媒体对象,也可以通过System.Windows.Media类集对绘图、文本和音频/视频内容进行编程,比如通过Brush、ImageBrush、VideoBrush绘制更加丰富的媒体内容;通过BitmapImage类自定义点阵图片,实现诸如粒子效果的应用;通过System.Windows.Media.Animation类集来创建动画;通过System.Windows.Media.Effects实现模糊、阴影等多种视觉特效;通过System.Windows.Media.Media3D操作3D投射矩阵。
Silverlight5还将增加GPU3D加速的API支持,增加3D视觉特效,增加即时模式图形API,允许将图形图像直接呈现到GPU,这些特性的加入将使Silverlight具有更强大的媒体展现能力。
· MEF扩展性管理框架的支持
MEF (Managed Extensibility Framework )扩展性管理框架,是.NET平台下用于创建可扩展的轻型应用程序的库。在Silverlight SDK(C:\Program Files\Microsoft SDKs\Silverlight\v4.0\Libraries)中我们可以找到System.ComponentModel.Composition.dll与System.ComponentModel.Composition.Initialization.dll这两个动态链接文件。在Silverlight项目中引用后,就可以使用MEF扩展性管理框架,该框架以声明方式指定其功能,在运行时通过MEF 组合引擎发现部件。应用程序无需硬编码的引用或脆弱的配置文件即可利用相关部件,其依赖项注册的实现方式甚至比基于配置的Spring还要简单,Silverlight完全可以利用MEF构建扩展性极强的企业级应用。
由此可见,Silverlight拥有比JavaScript更为重型的框架支撑,通过Silverlight可以快速移植桌面应用到Web端,也可以将Web应用脱开浏览器执行,或者构建轻型的桌面应用、移动设备应用。应该说Silverlight不仅仅是Web应用,在MSDN的知识库中,Silverlight已经从Web开发节点转到了.Net开发节点下,从这一点上可以看出微软正在进行Silverlight转型。