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轉型。
而未來的Windows 8操作系統的瘦客戶端UI-“Jupiter”將采用Silverlight,該界面將允許運行在基于ARM CPU的平板設備上。Silverlight 4憑借優秀的框架已經獲得了InfoWorld評出的2011年度最佳RIA平臺獎項,未來Silverlight還將擔負Web應用、移動應用和桌面應用的統一大業,Silverlight之重也在于此!
原文鏈接:http://www.infoq.com/cn/articles/wl-silverlight-heavy
【編輯推薦】