Silverlight 3作为微软最新的RIA平台,为我们带来了很多新特性。RIA顾名思义,即要有Internet,又要有Applicaiton。不过我们是否可以只要Applicaiton,也就是说把Silverlight 3作为开发桌面应用程序的一个平台呢?
下面,我就从几个方面来讨论基本构想和可行性:
部署和运行
可选方式1:利用Silverlight 3的Out-of-Browser特性。
描述:提供一个安装网页,在网页中嵌入一个Silverlight Plus-in来加载整个应用程序,但是只显示一个“Install”按钮来提示用户安装;用户安装后,从桌面快捷方式启动的时候判断此应用程序是否已经被安装了,如果是,那么就显示真正的程序主界面。
优点:最简单的部署运行方式,可自动升级。
缺点:访问本地数据有一定局限性,后面会讲到这个问题。
可选方式2:利用浏览器控件承载Silverlight插件。
描述:制作一个桌面程序的外壳,只包含一个浏览器控件(Browser Control),然后在这个控件中加载一个用来显示Silverlight应用程序的HTML网页。对于WinForms、WPF和Win32都有WebBrowser控件,也可以直接使用MSHTML组件,对于Linux,Mono利用Mozilla的Gecko引擎也实现了WebBrowser控件,对于Mac OS X,Mono利用WebKit引擎实现WebBrowser控件,当然你也可以直接去使用WebKit框架。另外,在Silverlight 3文档中的“Alternative Hosting”小节,还有其他的一些方式,但在我们的这种场景中没有必要使用。
优点:用户安装体验可以和普通的桌面应用程序一样。可以通过桌面外壳完成更多的事情,比如启动一个后台进程为Silverlight应用程序提供数据等。
缺点:稍显复杂,需要自己处理自动升级。
数据库和访问技术
可选方式1:XML文件和LINQ to XML
描述:把数据保存于XML中,Silverlight内置了LINQ to XML的支持,方便你读取XML数据。其实要操作XML数据,还可以用XmlReader和XmlWriter,但是这样明显不够方便。
优点:Silverlight SDK内置功能,简单易用。
缺点:不能类型化地访问数据。只适合处理简单数据。
可选方式2:XML文件和LINQ to XSD for Silverlight
描述:LINQ to XSD是.NET 3.5的一个很强大的组件,可以基于XML Schema(XSD)来生成对应的Object Model,然后类型化地操作XML数据。可以说就是一个Typed LINQ to XML。不过,由于Silverlight削减了很多函数库。这个东西无法在Silverlight运行起来。不过我相信Hack一下,应该可以实现。
优点:实现XML文件的类型化操作
缺点:实现步骤困难,需要用完整的.NET 3.5框架来协助。
可选方式3:ADO.NET Data Services
描述:整个方式和RIA模型中使用ADO.NET Data Services的方法大致相同,只是要利用第二种可选的部署和运行方式,在后台启动一个HTTP Services来承载ADO.NET Data Services的REST服务。当然,也可以hack一下让ADO.NET Data Services客户端函数库访问本地的XML文件,这样的话实际上和LINQ to XSD类似,只是利用其来完成xml到objects的转换。
优点:Silverlight内置支持,可以利用现在任何数据库技术。可以轻易移植为真正的RIA。
缺点:需要使用复杂的宿主模式,或者进行一些hack工作。
可选方式4:Db4o
描述:db4o 7.10开始不仅提供了完整的LINQ支持,而且还提供了Silverlight版本(我一开始还打算自己hack一下,结果去copy源码的时候,发现有个Db4o-Silverlight-2008.sln,哈哈)。
优点:最完善的存取数据的技术,可支持两种部署运行方式。
缺点:没有明显缺点,不过要注意许可证的问题,要不就付费,要不就遵守GPL。另外,如果想以后可移植为RIA,可以用ADO.NET Data Services来访问db4o。
存储本地数据文件
目前唯一方式:Isolated Storage。
为什么要这样做?
- 随着Silverlight的功能逐步强大,对于大部分应用程序使用Silverlight来开发已经足够,而无需诉诸WPF。
- 统一开发人员的技能,虽然Silverlight和WPF很相似,但毕竟是WPF的子集,某些实现和效果还是不一致。
- 用Silverlight就可以开发纯桌面应用程序和RIA,并在某些条件下可以轻易相互移植。
- 可以方便开发跨平台应用程序。虽然,Mono可以实现,但肯定没有Silverlight来得容易。
- 无聊才这样做……