上期笔者刚提出 Silverlight 之轻,本期就要讨论 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 强大的基础库与工具集快速构建出复杂的企业级应用。(敬请期待本专栏第四期《Silverlight CoreCLR 结构浅析》)
-
支持多线程,支持 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 声明式语言依赖于 Lambda 表达式,而 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 转型。
而未来的 Windows 8 操作系统的瘦客户端 UI-“Jupiter”将采用 Silverlight,该界面将允许运行在基于 ARM CPU 的平板设备上。Silverlight 4 凭借优秀的框架已经获得了 InfoWorld 评出的 2011 年度最佳 RIA 平台奖项,未来 Silverlight 还将担负 Web 应用、移动应用和桌面应用的统一大业,Silverlight 之重也在于此!
感谢张凯峰对本文的策划及审校。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家加入到 InfoQ 中文站用户讨论组中与我们的编辑和其他读者朋友交流。
评论