上面除了WPFToolKit和MEF以外都是一些经常使用的MVVM框架,连带本身开发的一共是八个,因此本身也取了一个响亮的名字——MVVM 八大框架!圣殿骑士本人实际项目中只用到了三个框架,以前WPF使用过MVVMHelpers,在Silverlight项目当中用过MVVMLight+MEF,后来就一直使用本身开发的框架,其余框架也研究了很长时间,但都是为了开发MVVM框架借鉴之用。框架虽然众多,但万变不离其宗,通用功能以下:
1,Model、View 和 ViewModel之间的关系:View和ViewModel如何关联起来(IOC)以及如何通讯(一般采用Message),ViewModel和Model之间的弱关联(一般采用接口或者简单注入)。
2,事件驱动模式在MVVM模式采用Command和Attached Behaviors的形式。
3,属性及ViewModel的NotifyPropertyChanged处理。
4,提供完整的单元测试,这也是保证框架的稳定性和维护性的保证。
也许有一些朋友会问我为何要研究这么多框架,其实作项目只须要认真研究并实践其中一个就行,研究它们的缘由则主要归功于本身开发MVVM框架的须要。下面就让咱们来看一下具体有哪些MVVM的开源框架(具体到每个框架后面有时间再阐述,一篇文章写得确实很累):
2,最强大且功能最多的组合框架——Prism
下载地址:http://compositewpf.codeplex.com/
开发者:微软patterns & practices团队
是否支持Silverlight:是
学习资料:Composite Application Guidance for WPF and Silverlight - May 2010.chm以及Quickstarts和StockTraderRI等。
源码截图以下:
图4
Prism——以前又叫Composite Application Guidance for WPF and Silverlight,它是构建复杂的基于WPF/Silverlight企业级应用的主流框架。Prism中有几个比较重要的概念:
1,BootStrapper:应用程序切入点,继承Prism的UnityContainer或MEF提供的MefUnityContainer,为系统提供一个容器。
2,Shell:它是一个外壳,经过UI元素和Region布局页面。 它是应用程序的顶级窗口,显示的内容通常就由View来填充,Shell自己并不知道它包含了哪些内容,因此功能则是由各个Module来具体提供。
3,View:它等同于MVP模式、MVVM模式中的View。能够经过IRegionManager注入到Region中。
4,Module:能够把一个大项目拆分开来,每个Module都包含View、数据、模型,主要用于实现复杂业务操做。
5,IModuleManager:主要用于管理模块加载,能够实现动态加载。
6,IEventAggregator:事件处理接口,实现订阅和发布模式,这也是MVVM框架的通常作法。
Prism是一个比较庞大的组合框架,4.0引入MEF及功能调整之后变得更增强大了,如今能够说是组合框架和应用框架的统一体,并且是微软团队的力量,因此选它是值得保证的。
3,最强大且功能最多的应用框架——Caliburn
下载地址:http://caliburn.codeplex.com/
开发者:Rob Eisenberg
是否支持Silverlight:是
学习资料:我主要参考项目实例、源码、单元测试用例、国外一些博客和社区。
源码截图以下:
图5
Caliburn中有几个比较重要的概念:
1,在Actions基础上的Commands带有不少功能,其中包括多参数、过滤操做以及异步调用。
2,窗体和控件的生命周期事件也处理得比较好(包括activation、deactivation、shutdown等)。
3,不论是整个框架仍是基于这个框架的应用程序的可测性都比较好。
4,提供了不少经常使用功能,这些在项目当中都比较有用。
5,除了支持MVVM模式以外,还很好的支持MVP模式以及其余的一些变种模式。
6,强大的依赖注入框架以及AOP框架,这里能够灵活选用其中一种。
Caliburn是一个很是强大的MVVM应用框架,对不少功能都提供了灵活且多种实现,不管是项目使用仍是研究代码,感受都受益颇多。
4,轻量级且适用的MVVMLight
下载地址:http://mvvmlight.codeplex.com/
开发者:Laurent Bugnion
是否支持Silverlight:是
学习资料:除了online documentation,我主要参考项目实例、源码、单元测试用例、国外一些博客和社区。另外这三篇文章很是不错,用MVVMLight开发了一个比较完整的Silverlight企业项目
- Part 1 - Introduction, Installation, and General Application Design Topics
- Part 2 - MVVM Light Topics
- Part 3 - Custom Authentication, Reset Password and User Maintenance
源码截图以下:
图6
MVVMLight中有几个比较重要的概念:
1,RelayCommand:经过对Command进行封装,使得MVVM模式在WPF和Silverlight上更加容易。你只须要在 ViewModel中定义好各个RelayCommand,而后在View中经过Command来绑定ViewModel中定义好的 RelayCommand,就能够实现像WinForm、ASP.NET事件同样的效果,只不过这里是解除了UI和逻辑的强耦合。
2,Messager:MVVMLight中的Messager做用比较大,前面讲了MVVM模式解除了ViewModel和View的强引用,那么它们如何来进行交互呢?就是靠它来让ViewModel和View来进行通讯的。通常咱们会定义一个静态AppMessages类来做为通用的一个通讯类,原理就是发布订阅模式。
3,EventToCommand:这里就比较相似于附加行为的概念,是在MVVM Light Toolkit V3中开始引入的概念。
4,ICleanup接口:当显示某个View时,须要先调用Cleanup方法清除数据,这也是因为ViewModel和View的耦合隔离产生的一些必要操做。
MVVMLight是一个很是好用的MVVM框架,提供了VS和Blend的模板及智能感知。它结合MEF使用真的感受很轻量级且高效,并且提供了WPF和Silverlight的支持,尤为在Silverlight的支持上比较好,因此通常选择轻量级的Silverlight MVVM模式,它比较被看好。
5,功能齐备且易用的MVVM Helpers
下载地址:http://mvvmhelpers.codeplex.com/
开发者:Mark Smith
是否支持Silverlight:否
学习资料:http://www.julmar.com/blog/mark/以及提供的实例、源码及测试用例。
源码截图以下:
图7
MVVM Helpers又叫JulMar MVVM Helpers + Behaviors,其中有几个比较重要的概念:
1,提供了MVVM模式的基本功能,包括ViewModel、View及Model之间的隔离,另外还提供了一些经常使用功能。
2,ViewModel的建立使用标签的形式注入,如今也能够引入MEF。
3,IOC/DI的支持,属性都有验证机制,Wait Cursor的支持,当使用完viewmodel以后能及时释放,这样避免内存泄露。
4,提供了经常使用的Attached Behaviors支持。
5,消息机制的引入,避免强引用产生的耦合。
MVVM Helpers是一个很是适用的MVVM框架,尤为是提供了MVVM经常使用功能+MEF+Attached Behaviors,因此项目中的问题基本都能解决。
6,功能强大且轻巧的Cinch
下载地址:http://cinch.codeplex.com/
开发者:Sacha Barber
是否支持Silverlight:否
学习资料:http://sachabarber.net/以及提供的实例、源码及测试用例。
- A walkthrough of Cinch, and its internals - Part I
- A walkthrough of Cinch, and its internals - Part II
- How to develop ViewModels using Cinch
- How to Unit test ViewModels using Cinch app, including how to test Background work threads which may run within Cinch ViewModels
- A Demo app using Cinch
源码截图以下:
图8
若是仔细研究其代码,你会发现它和上面讲的MVVM Helpers有不少类似的代码,估计是相互参考了一番:-D。Cinch 中有几个比较重要的概念:
1,这个框架在没有MEF出现以前就已经实现了ViewModel和View之间的强引用隔离,它既没有通常IOC的配置,也没有IView来作中转,而且窗体和控件的生命周期事件也处理得比较好,因此在这方面来讲是很是不错的。
2,提供了经常使用的Attached Behaviors支持,另外也提供了一些MVVM经常使用功能。
3,DI/IOC使用Unity实现,多线程的实现,避免系统出现不可预料的错误。
4,当使用完viewmodel以后能及时释放,这样避免内存泄露,验证机制的加入,经常使用导航实现。
5,消息机制的引入,避免强引用产生的耦合。
Cinch 是一个很是强大的框架,尤为是它比较着眼整个应用程序的搭建,因此也比较受到青睐。
7,功能简单且易扩展的MVVMFoundation
下载地址:http://mvvmfoundation.codeplex.com/
开发者:Josh Smith
是否支持Silverlight:否
学习资料:http://joshsmithonwpf.wordpress.com/以及提供的实例、源码及测试用例。
源码截图以下:
图9
MVVMFoundation中有几个比较重要的概念:
1,Messenger:这里主要用在各类不一样的ViewModel之间通讯(好比相互关联的ViewModel、主从ViewModel等),固然也能够扩展成ViewModel与View之间进行通讯。
2,ObservableObject:这里至关于ViewModelBase的概念,每个ViewModel继承自该类,调用完成以后当即释放,防止内存泄露。
3,PropertyObserver:主要是对INotifyPropertyChanged.PropertyChanged进行封装,这样封装能够精简代码,同时能够防止不当操做引发的内存泄露。
4,RelayCommand接口:封装command的声明,包括execution执行逻辑,可选的can-execute逻辑等。外部只须要实例化并Binding就能够简单使用。
MVVMFoundation是一个很是简单的MVVM框架,若是你以为研究源码比较困难,就能够先从这个框架入手,代码简单并且精炼。
8,附加:支持插件式的依赖注入MEF
源码截图以下:
图10
9,如何充分利用这些框架
上面咱们已经介绍了七大MVVM框架+支持插件式的依赖注入MEF,其实另外这三个框架WPF Application Framework (WAF)、Calcium、CoreMVVM(Basic MVVM framework)也很值得研究,因为时间和精力的关系,针对这三个框架圣殿骑士也没有进行仔细的剖析,只是粗略看了一下基本功能。
其余一些框架诸如Onyx、nRoute、Nito MVVM、Ocean、GoodLight就没有太多关注,有兴趣的朋友也能够选择其中某一个或多个框架做为研究和学习,不过仍是推荐研究主流的框架,毕竟这些主流框架的开发团队和成熟度都比较强。
上面看到了这么多MVVM框架,那么咱们应该怎么去学习和使用呢?简单来讲能够概括为如下几句话:
1,根据具体的项目选择适合的框架,团队和项目有大有小,因此得根据这些来选择具体的框架,其实终归来讲,几个框架功能都比较相似。
2,框架不用研究太多,只要适用于项目就行,尤为是熟练使用并根据其提供的TDD测试代码追溯其原理。
3,框架不是万能的,对于某些应用和功能能够对框架扩展,这也开源最大的好处之一。
针对框架的研究,本身也总结了几点:
1,首先看框架的相关介绍,了解相关的背景、功能、架构图以及其余一些相关信息——认识了解。
2,根据介绍查看并调试框架所提供的实例——熟悉功能。
3,本身写一些相关的项目,主要是熟悉该框架,若是说要急于作项目,后面就能够把框架引入到项目当中——具体使用。
4,根据该框架提供的详细单元测试研究其源码,这也是我最喜欢研究这些开源框架的缘由——原理剖析。
5,经过上面的步骤认真分析其原理及细节——准备重现。
6,本身也根据以前的思路重复开发这个框架,最好能用TDD——框架复原捷径。
上面咱们谈了一些开源框架相关知识,下一步咱们得本身开发一个MVVM框架,一方面是对知识的总结,另外一方面也是对知识的再提炼,同时也能使本身的认识提高到另外一个高度,紧接下文。
十. 本身开发MVVM框架
因为以前本身作了一套框架,可是尚未趋于完善,因此暂时不许备共享出来(主要是WPF和Silverlight版本更替比较频繁且没有加入模板及智能感知)。对于开发一套MVVM框架,具体须要作一下几个操做:
1,要能解决Model、View和ViewModel之间的强关联,这也是核心功能,尤为是View和ViewModel,不论是使用IOC Container仍是MEF都行。
2,命令和附加事件的处理,对Command进行封装,知足多参数、方法过滤、泛型、异步回调等,对附加事件进行封装,使它像使用命令同样简便。
3,因为View和ViewModel是弱关联或者是无关联,如何让它们进行通讯?这就须要加入Messenger机制。
4,前面引入了消息机制(通常是静态化处理),如何来管理、实例化、清除消息呢?这里得创建一套消息机制。
5,因为前面采用了弱关联或者无关联,而且引入了消息机制,因此须要对操做有日志记录,不然出了问题没法快速定位及追查缘由。
6,如何统一管理ObservableObject、PropertyObserver等这些对象呢?因此得本身创建一套变动体系。
7,对经常使用功能及操做进行封装,提供一些经常使用类库以及UI Helper等。
总之,开发MVVM框架不能求全,只要适合项目就行,也不要想一次就能完善整个框架,在使用时不断根据需求扩展才是明智之举。另外附加三点开发MVVM框架心得:
1,充分借鉴其余开源框架,研究各个框架的不足和优点,而后把思想贯穿于本身的框架中,固然有些经常使用功能代码也能够直接借鉴过来。
2,对于这样一个比较庞大的框架,使用TDD+反复重构无疑会提升开发效率,同时也能提升框架的可维护性和稳定性,这也是团队使用的一个前提。
3,框架会使用一些经常使用设计模式,有了它们可让框架更具备扩展性,同时也减小了开发成本、增长了可维护性。好比观察者模式(消息的发布、订阅、触发)、中介者模式(直接通讯的类转化为中间类来处理,隔离耦合)、外观模式(提供一个简单的接口出来,在内部进行大量的封装,这样就能够起到易用且功能强大的目的)、装饰模式(原来已经稳定的功能模块,若是在不改变原有结构的基础上进行扩展,无疑这是一个很好的实践)等。
----------------------------------------------------------------------------------------
如下是各类开源控件,就不介绍了。
Fluent Ribbon Control Suite
Microsoft Ribbon for WPF
AvalonDock
PropertyEditor for WPF
WPF Property Grid
PropertyInspectorView
WPF Dynamic Data Display
Swordfist WPF Charts
WPF Toolkit
AvalonEdit