Prism研究(for WPF & Silverlight) 1-3(转)
http://www.cnblogs.com/Jax/archive/2009/05/25/1488797.html
Prism研究(for WPF & Silverlight)
目录
一. Prism概述
二. Prism评估
三. Prism文档导读
四. 从Hello World开始
五. Prism中的术语和概念
六. Prism中的模式
七. Module
八. View
九. Event
十. Command
十一. Service
十二. Multi-Target
十三. Acceptance Test
十四. 自定义活动
十五. RI源码分析
十六. UI设计规则
十七. 部署和发布
十八. CodePlex问题汇总
一.Prism概述
Prism是Composite Application Guidance for WPF的简称,是用于WPF和Silverlight的企业级框架,由微软P & P(patterns & practices)小组设计。
Prism不是横空出世的,它的前身是CAB——这是专门为Winform开发而设计的框架。后来,在2008年6月,P & P小组推出了Prism的第1个版本,专为WPF而设计的。而在2009年2月,则推出了Prism的第2个版本,同时适用于WPF和 Silverlight,也就是我这个系列所要探讨的。
Prism安装
Prism只是由几个dll组成,对WPF而言是6个,对Silverlight而言是5个。因此使用者不需要额外安装项目模板到VS2008中,只要在项目中添加对它们的引用即可。
以下是使用Prism所需要的相关资源:
1. 下载Prism框架
这是一个绿色的包。所以安装后,会解压到一个用户指定的目录(我指定的名字是PRISM,放在桌面上),截图如下:
目录下都是些虾米东东呢?
· CAL中是Prism框架的源码——理解Prism的最重要的参考。
· LIB中是CAL中Prism框架源码Build生成的dll,也就是产品。用户可以直接把这个项目下的dll添加引用到自己的项目中,就能使用Prism框架了。
· QuickStart,这是一组快速上手的Demo。从HelloWorld开始,还涉及到Module、View、Event、Commond和Multi-Target等5大类10多个小例子。
· RI是一个成熟的虚拟股票交易程序的源码,有WPF和SilverLight两个版本。
· ChartControls是RI所引用到的自定义控件(如饼图)。
· AcceptanceTestLibrary目录是Acceptance Test(验收测试)这个dll的源码。后面我们会提及什么是Acceptance Test以及如何使用。
· 所有的bat文件都指向QuickStart、CAL和RI中的.sln文件,也就是说,是打开各个项目的快捷方式。
2. 下载Prism文档
在上面的安装包中其实就应该有这个文档了,即:
Composite Application Guidance for WPF and Silverlight - February 2009.chm
如果没有,请到以下地址下载:
http://www.codeplex.com/CompositeWPF/Release/ProjectReleases.aspx?ReleaseId=14982
这份305页的文档详细地介绍了Prism的一切内容。记住,一定要下载Feb 2009的那个版本哦。
注:我的这个系列文章也是基于这份文档的。但是文档毕竟只是用来Release给客户看的,所以套话废话很多,并且有“老王卖瓜”之嫌,所以我要写这个系列,删繁就简是一方面,同时还涉及到自己的一些心得,以及我在工作中的遇到的诸多疑难杂症。
Prism吹水
Prism的优点如下:
· 把界面(Interface)与逻辑相剥离,从而美工和程序员可以各按其事,互不干扰。这个想法有点乌托邦,因为WPF程序员和超女一样满大街都是,但Blend美工在国内凤毛麟角,不要奢望在你的Team中有这样的一个人。
· 把界面拆分成若干小的模块(Module),从而使模块间的交互实现了最大的松散耦合,降低了“牵一发而动全身”的风险。此外,在部署的时候,也可以实现 按需(OnCommand)加载和更新,尤其是对Silverlight而言,用户只有在需要这个模块的时候才会去下载,而不用长时间等待所有的模块加载 完毕。
· 模块的拆分,使得开发和测试也可以独立地进行。这是因为Prism使用了TDD的设计理念,当然我们在开发流程中也要follow这样的思想去编程,即“开发未动,测试先行”。
· 最大程度的实现了可复用(re-use)。尤其是日志关联和权限管理,是完全独立于主逻辑的(在数学上,这叫垂直关系,二者的叉积为零,从而各自改变而互不影响)。
Prism只是一个框架,所以它与以下技术无关:
· 偶发连接(SmartClient的特性)
· 通信机制(这是WCF的职责)
· 应用程序性能
· 错误处理机制
· 权限验证(可以使用MemberShip)
· 线程同步
· 版本控制
研究Prism的过程,是对自身技术修为的一次洗礼。Prism的设计理念中充斥着大量的设计模式,因此,读起来有如沐春风之感。但是,真正用起来就麻烦了,往往一个简单的逻辑在Prism中就要很复杂,几行代码会变成几百行——对于小型项目而言,是不适合用这套框架的。
我们可以从项目一开始就使用Prism进行开发,也可以对原有老的WPF或Silverlight项目进行升级。我的切身感受是,升级并不是很麻烦,只要想清楚这套框架的逻辑,因此,改变设计理念是很重要的。
Prism相关资源:
国内对Prism的传经授道很早就开始了,比如说博客园的周银辉和张兴浩,他们分别在自己的项目中使用到这个框架,因此有丰富的心得体会以及大量的介绍性文章,博客地址如下:
· 周银辉:http://www.cnblogs.com/zhouyinhui
· 张兴浩:http://www.cnblogs.com/Clingingboy
此外,P & P 官方论坛也是很不错的地方,上面有来自全世界的反馈和TroubleShooting,地址如下:
二.Prism评估
以下是对Prism文档P7-P8的翻译。
架构师和开发者需要花费些时间以完全理解和评估Prism。虽然 并不存在一种简单的方法对一个项目进行评估,但是这份文档还是把评估的过程划分为4个步骤:
1. 适合性分析(Fit Analysis)。判断Prism是否适合于你的需要。
2. 初始评估(Intial evaluation)。安装、运行并检查Prism。
3. 深度评估(In-depth evaluation)。对Prism进行全部的检查。
4. 采纳(Adoption)。将Prism集成到一个复杂的应用程序中。
步骤1:适合性分析
Prism是用来设计复杂的WPF和Silverlight应用程序的。下面的场景是你在使用Prism时应该考虑的:
你正在创建一个复合的应用程序,通过一个集成的用户接口来表示来自多个源的信息。
你正在开发、测试并部署相互独立的模块。
你的应用程序今后将添加更多的View和函数。
你必须能够快速安全地改变应用程序,以满足企业级需要。
你的应用程序是由多个小组合作开发的。
你的应用程序是以WPF和Silverlight为目标,并且你想要在这两个平台间共享尽可能多的代码。
如果你的应用程序并不需要这些场景中的一个或多个,那么Prism可能并不适合你。例如,你的应用程序由一些简单的界面组成,或者你正在创建一个原 型或演示应用程序,或者你的开发人员并不熟悉这些观念或也没有实践过,并且也没有时间去学习,那么Prism对你而言可能也是不适合的。
为了判断Prism是否为一个有潜力的框架,你需要理解这个框架所要解决的问题。下面的部分将帮助你执行这样的适合性分析。
- 什么时候使用Prism
- 目标和优点
- 模块化设计概念
- UI Composition设计概念
- 适用的人群
应该使用1到2个小时来完成这一步骤。
第2步:初始化评估
为了近距离接触Prism,你将要学习到更多关于Prism类库的设计,以决定复合的应用程序框架是如何匹配到你的企业级解决方案框架的。你还需要通过开发一个简单的“Hello World”应用程序来看一下这些代码。
需要阅读如下相关的主题:
Composite Application Library
Separated Presentation和Dependency Injection模式
容器(Container)设计概念
Container、Services、Event Aggregator和UI Composition
第3步:深度评估
在决定为你的应用程序使用Prism之前,你可能想要执行一次深度评估。Prism推荐你评估QuickStart和Stock Trader RI,并考虑开发一个基于概念的应用程序,以获得对这个类库的深度理解。在这一点上,你还应该考虑到对该类库所需要的扩展和优化,这将帮助你满足你的企业 级需求。
在开始你的proof-of-concept应用程序之前,Prism建议你阅读下面相关的内容:
技术概念:
Bootstrapper
Module
Shell and View
Commands
Communication
Multi-Targeting
检查QuickStart
熟悉Stock Trader RI
当你开发自己的proof-of-concept应用程序时,你应该阅读相关的How to主题。
第4步:采纳
Prism具有一个明确的目标,就是提供一个好的使用体验。为了完成这个目标,Prism提供了下面的建议:
你可以使用或不使用Prism类库。例如,你可以只使用你所需要的服务。
你可以增长性地添加Prism类库到你已有的WPF或Silverlight应用程序中。
你可以创建WPF和Silverlight应用程序以共享尽可能多的代码。
为了使用Prism,你将要执行下面的任务:
决定你将如何使用类库的:按照原先的样子,或者,自定义适合你需要的类库。
对在Key Decision中描述的关键决定进行决策,并和Team的其它成员进行交流。
培训你的开发Team关于Prism的技术。开发者应该review下面的主题:以下省略
培训你的设计Team关于Prism的知识。设计者需要review下面的主题:以下省略
三.Prism文档导读
话说,哥哥阅读这份300页的英文文档仅仅用了11天,不是显摆,是因为项目紧,要求尽快上手,于是夜以继日地研读和实践,草草过了一遍。时至今 日,我终于发现设计模式的重要性,很多地方大致看看UML图就能理解其实现,此外,如果对Winform和ASP.NET都有所涉及,也会使得学习 Prism框架轻松很多,最后,强调一下千万不要对WPF和Silverlight厚此薄彼,虽然二者是不兼容的,但理念是相同的,同时掌握不会耗费太多 精力,反而会使你醍醐灌顶,甘露洒心。
言归正传。本文档目录如下:
页数 |
主题 |
描述 |
1-12 |
Overview |
基本都是废话,有价值的我都提取出来,参见我这个系列的前面两章。 |
13-27 |
Design Concepts |
对Prism最基本概念的简单介绍,算是扫盲了。建议看完QucikStart章节再返回来看一遍这几页,别有一番滋味。 |
28-41 |
Composite Application Library |
对Prism框架的初步分析。基本是在吹水。草草读过即可,没必要死抠概念。 |
42-59 |
Stock Trader Reference Implementation |
对Stock Trader RI这个以Prism为框架的开源项目的初步分析,只能算是个引导,想搞明白还是要自己看源码。 |
60-78 |
Patterns in the Composite Application Library |
Prism中涉及的5个新模式,Prism的精髓,一定要仔细研读这部分。 |
79-126 |
Technical Concepts |
Prism中涉及到的概念的详细介绍,非常detail,看不懂没关系,因为下面两章就是在讲如何使用它们的例子。 |
127-148 |
Hands-On Lab |
一个HelloWorld的例子,一步步指导读者完成,分为WPF和Silverlight两个版本。 |
149-197 |
QuickStarts |
对Prism提供的QuickStart目录中所有例子的分析,建议结合Technical Concepts这一章一起看。 |
198-246 |
Development Activities |
由若干How to组成,其实就是Technical Concepts一章的翻版,内容都是重复的,不看也罢。 |
247-252 |
Project Linker |
介绍如何使用Project Linker来管理Multi-Target项目,意义不大,不看也罢。 |
253-261 |
UI Design Guidance Overview |
Prism下设计和编程的隔离准则,Mock在Prism中的技巧,等等。大多泛泛而谈,所以我会在介绍到这里时补齐所有的例子。 |
262-280 |
Deploying WPF Applications with ClickOnce |
使用ClickOnce部署、发布、更新WPF的方法,和Prism主题无关,不看也罢。 |
281-282 |
Deploying Silverlight Applications |
介绍如何部署Silverlight,和Prism主题无关,不看也罢。 |
283-288 |
Customization Activities |
介绍如何打造自己的活动,两个例子:如何创建一个自定义的Region Adapter;如何使用自定义的日志管理器。 |
289-303 |
Upgrading from Previous Versions |
介绍Prism版本的变革,这是给那些使用过老的Prism的朋友看到,对于入门者,略过它吧。 |
304-305 |
Glossary |
Prism术语汇总 |
看完我这份清单,会发现,其实精华内容也就200页不到的样子。最后,是这份文档的SiteMap,如果你看完了305页,可以再回过头来瞅瞅这个结构图,查漏补缺:
未完待续。。。