促销网站怎么做,宜春网站推广优化,青海省电话黄页,织梦网站模板摘要 WPF企业内训全程实录由于文章比较长#xff0c;所以一共拆分成了三篇#xff0c;上篇WPF企业内训全程实录#xff08;上#xff09;主 要讲了基础#xff0c;这篇作为该实录的中篇#xff0c;起着承上启下的作用,主要讲解开发模式、团队协作及应用框架。其实如果大家…摘要 WPF企业内训全程实录由于文章比较长所以一共拆分成了三篇上篇WPF企业内训全程实录上主 要讲了基础这篇作为该实录的中篇起着承上启下的作用,主要讲解开发模式、团队协作及应用框架。其实如果大家仔细看目录可以发现我安排的顺序是首先讲 解最基本的概念和基础内容、然后过渡到开发模式及框架、最后结合其他技术和项目实际运用这也是学习并应用一门技术最好的流程。上篇实际上主要有两个侧重 点一则就是理清脉络——历史渊源、概念引入及基本阐述二则是讲解WPFBasic——主要讲解WPF的每个知识点涵盖了WPF的方方面面如果大家 感兴趣可以下载代码进行仔细研究如果有不懂的地方也可以参考我写的WPF 基础到企业应用系列这里受篇幅限制就不详细论述。今天的中篇主要围绕WPF开发模式、WPF团队协作和MVVM框架三个议题进行阐述希望能给大家带来一些参考和帮助。 章节纲要 · 1.摘要· 2.本文提纲· 3.简要介绍· 4.WPF介绍· 5.WPF基础· 6.WPF工具· 7.WPF开发模式· 8.WPF团队协作· 9.了解并使用MVVM框架· 10.自己开发MVVM框架· 11.其他技术引入· 12.WPF项目及性能优化· 13.部署与更新· 14.总结· 15.详细技术索引 七. WPF开发模式 提到WPF开发模式这里通常所说的是Presentation模式其他层的模式不在此列大家可能会立马想到MVC/MVP/MVVM模式 1MVC模型视图控制器Model View Controller)2MVP模型视图表现类Model-View-Presenter3MVVM模型视图视图模型Model-View-ViewModel 的确时下流行的就这三种常见的Presentation模式这三种模式又衍生了很多变种从根本上说这些模式是为了解决如下的几个问题 1逻辑与UI紧密耦合更换UI上的显示往往需要更改很多逻辑代码正所谓“牵一发而动全身”。2应用程序状态的维护主要包括状态 (State) 逻辑 (Logic) 同步 (Synchronization)耦合太紧。3不能使不同的UI共享相同的逻辑复用问题。4要测试用户界面效果你需要做复杂的UI测试。5团队协作不能充分发挥因为耦合太紧的关系。6维护比较困难这也是由于耦合紧密且没有完整的单元测试。 之前的C/SWinForm和B/SASP.NET/ASP.NET MVC我们已经习惯了MVC和MVP模式现在针对WPF和Silverlight的具体特征——它带来了3D、动画、音频、视频……这导致了UI的变 化将更加细节化和可定制化。同时在技术层面上WPF和 Silverlight也带来了诸如Binding、 Dependency Property、Routed Events、Command、Attached Behavior依赖属性体系间接实现、DataTemplate、ControlTemplate等新特性。我们怎样才能立足于原有的技术框架并把 WPF/Silverlight的新特性揉合进去以应对客户日益复杂且多变的需求呢那么MVVM模式就是一个不错的选择详见如下框架图 图1 在MVVM模式中你需要一个为View量身定制的model那么这个model实际上就是上图ViewModel。ViewModel包含 所有UI所需要的接口、属性和命令这样只需要通过Binding使他们进行关联就可以使二者之间达到松散耦合所以这样一来UI就可以由UI专业人 员用Design和Blend来实现当然很多效果还是需要用传统的制图软件所以我们都称这种想法叫理想状态代码人员也可以专心写他的逻辑和业务代 码所以这样分工和协作变得更轻松、更愉快了。更漂亮的是View完全可以由Unit/Automatic Test所取代所以单元测试也变得相对简单。这对于我们的开发人员和测试人员无疑是一个很好的解脱同时也提高了系统的可测性、稳定性和维护性。数据 绑定系统同时也提供了标准化的方式传输到视图的错误验证和输入验证但是个人觉得不是很好用所以我们在实际的项目当中会写一套自己的验证框架。 讲到这里我们这里不得不引入下面这幅图我觉得它能阐述一些比较重要问题 图2注此图引用自Robert McCarter的MVVM一文 上面的这幅图表达了几个概念 1Domain Model 始终是应用程序的核心必须投入大量精力按照面向对象的分析和设计 (OOAD) 最佳做法进行设计同时按照OOP进行开发。2Model、View 和 ViewModel 层之间实施严格的分离也强调了它们之间是一种松散耦合的关系。3每一层或者每一个模块都有自己完整的单元测试这样即提高了代码质量同时也增强了稳定性和可维护性。4不要为了MVVM而MVVM不要强调UI端不产生一句后台代码而把所有代码都扔进ViewModel因为有的操作如果不参与逻辑流程放在UI端处理会更好这也符合UI和逻辑隔离的最终原则。 当然使用这个模式的时候我们还要注意很多细节这个是我们必须面对的比如我们怎么实现View和ViewModel关联、View和 ViewModel如何通信、ViewModel与ViewModel如何交互、ViewModel和Model之间的弱关联、怎样用 Attached Behavior实现特定命令操作、怎样弹出UI、怎样实现导航、Validation的自定义设置、异步调用、延迟加载、性能优化、与传统技术的交互等 等问题。 八. WPF团队协作 前面我们讲了WPF的开发模式针对不同的开发模式团队协作也会有一些具体的改变不管是MVC、MVP还是MVVM无疑都强调的是 Presentation所以我们的域模型和底层操作都不会有所变化或者严格一点的说是只能影响到服务层/域模型之上的操作如果不考虑多系统分布 式、ESB及SOA体系就可以分成以下六种角色 专业美工人员整个系统的基调与样式、页面布局图、页面效果图、页面的样式与颜色、常用按钮图标、常用图标图片等等。 XAML人员StyleTemplateTriggerResource用XAML代码书写另外强调和美工及ViewModel人员的交互与合作。 ViewModel 主要封装领域模型暴露的接口然后提供给View所以这里强调UI和领域模型的一个适配作用。 领域模型核心应用程序的核心必须投入大量精力按照面向对象的分析和设计 (OOAD) 最佳做法进行设计同时按照OOP进行开发。 框架常用功能开发人员这里就包括MVVM框架的开发、维护以及扩展同时还包括数据底层访问、日志、异常、常用功能等。 数据库开发和管理人员数据库库表的建立及维护、数据库脚本的创建及维护、数据库优化以及日常的数据操作问题。 当然在开发中这六种角色也并不是完全分离的可以根据具体需求进行调整同时也可以根据项目的功能划分模块总之选择项目最合适的协作方式就行。 九. 了解并使用MVVM框架 1到底有哪些开源MVVM框架 前面介绍了WPF的基本概念和一些相关知识我们了解到开发WPF应用程序可以使用现成的框架和模式最为合适的莫过于时下正热的MVVM模式所以这里我们也列出针对MVVM模式的已有开源框架 图3 上面除了WPFToolKit和MEF之外都是一些常用的MVVM框架连带自己开发的一共是八个所以自己也取了一个响亮的名字——MVVM 八大框架圣殿骑士本人实际项目中只用到了三个框架之前WPF使用过MVVM Helpers在Silverlight项目当中用过MVVMLightMEF后来就一直使用自己开发的框架其他框架也研究了很长时间但都是为 了开发MVVM框架借鉴之用。框架虽然众多但万变不离其宗通用功能如下 1Model、View 和 ViewModel之间的关系View和ViewModel如何关联起来IOC以及如何通信通常采用MessageViewModel和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中有几个比较重要的概念 1BootStrapper应用程序切入点继承Prism的UnityContainer或MEF提供的MefUnityContainer为系统提供一个容器。2Shell它是一个外壳通过UI元素和Region布局页面。 它是应用程序的顶级窗口显示的内容一般就由View来填充Shell本身并不知道它包含了哪些内容所以功能则是由各个Module来具体提供。3View它等同于MVP模式、MVVM模式中的View。可以通过IRegionManager注入到Region中。4Module可以把一个大项目拆分开来每一个Module都包含View、数据、模型主要用于实现复杂业务操作。5IModuleManager主要用于管理模块加载可以实现动态加载。6IEventAggregator事件处理接口实现订阅和发布模式这也是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 TopicsPart 2 - MVVM Light TopicsPart 3 - Custom Authentication, Reset Password and User Maintenance源码截图如下 图6 MVVMLight中有几个比较重要的概念 1RelayCommand:通过对Command进行封装使得MVVM模式在WPF和Silverlight上更加容易。你只需要在 ViewModel中定义好各个RelayCommand,然后在View中通过Command来绑定ViewModel中定义好的 RelayCommand就可以实现像WinForm、ASP.NET事件一样的效果只不过这里是解除了UI和逻辑的强耦合。2MessagerMVVMLight中的Messager作用比较大前面讲了MVVM模式解除了ViewModel和View的强引用那 么它们如何来进行交互呢就是靠它来让ViewModel和View来进行通信的。一般我们会定义一个静态AppMessages类来作为通用的一个通信 类原理就是发布订阅模式。3EventToCommand这里就比较类似于附加行为的概念是在MVVM Light Toolkit V3中开始引入的概念。4ICleanup接口当显示某个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之间的隔离另外还提供了一些常用功能。2ViewModel的创建使用标签的形式注入现在也可以引入MEF。3IOC/DI的支持属性都有验证机制Wait Cursor的支持当使用完viewmodel之后能及时释放这样避免内存泄露。4提供了常用的Attached Behaviors支持。5消息机制的引入避免强引用产生的耦合。 MVVM Helpers是一个非常适用的MVVM框架尤其是提供了MVVM常用功能MEFAttached Behaviors所以项目中的问题基本都能解决。 6功能强大且轻巧的Cinch 下载地址http://cinch.codeplex.com/ 开发者Sacha Barber 是否支持Silverlight否 学习资料http://sachabarber.net/以及提供的实例、源码及测试用例。 A walkthrough of Cinch, and its internals - Part IA walkthrough of Cinch, and its internals - Part IIHow to develop ViewModels using CinchHow to Unit test ViewModels using Cinch app, including how to test Background work threads which may run within Cinch ViewModelsA Demo app using Cinch 源码截图如下 图8 如果仔细研究其代码你会发现它和上面讲的MVVM Helpers有很多相似的代码估计是相互参考了一番:-D。Cinch 中有几个比较重要的概念 1这个框架在没有MEF出现之前就已经实现了ViewModel和View之间的强引用隔离它既没有一般IOC的配置也没有IView来做中转并且窗体和控件的生命周期事件也处理得比较好所以在这方面来说是非常不错的。2提供了常用的Attached Behaviors支持另外也提供了一些MVVM常用功能。3DI/IOC使用Unity实现多线程的实现避免系统出现不可预料的错误。4当使用完viewmodel之后能及时释放这样避免内存泄露验证机制的加入常用导航实现。5消息机制的引入避免强引用产生的耦合。 Cinch 是一个非常强大的框架尤其是它比较着眼整个应用程序的搭建所以也比较受到青睐。 7功能简单且易扩展的MVVMFoundation 下载地址http://mvvmfoundation.codeplex.com/ 开发者Josh Smith 是否支持Silverlight否 学习资料http://joshsmithonwpf.wordpress.com/以及提供的实例、源码及测试用例。 源码截图如下 图9 MVVMFoundation中有几个比较重要的概念 1Messenger:这里主要用在各种不同的ViewModel之间通信比如相互关联的ViewModel、主从ViewModel等当然也可以扩展成ViewModel与View之间进行通信。2ObservableObject这里相当于ViewModelBase的概念每一个ViewModel继承自该类调用完成之后立即释放防止内存泄露。3PropertyObserver主要是对INotifyPropertyChanged.PropertyChanged进行封装这样封装可以精简代码同时可以防止不当操作引起的内存泄露。4RelayCommand接口封装command的声明包括execution执行逻辑,可选的can-execute逻辑等。外部只需要实例化并Binding就可以简单使用。 MVVMFoundation是一个非常简单的MVVM框架如果你觉得研究源码比较困难就可以先从这个框架入手代码简单而且精炼。 8附加支持插件式的依赖注入MEF 下载地址http://mef.codeplex.com/ 源码截图如下 图10 9如何充分利用这些框架 上面我们已经介绍了七大MVVM框架支持插件式的依赖注入MEF其实另外这三个框架WPF Application Framework (WAF)、Calcium、CoreMVVMBasic 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框架会使用一些常用设计模式有了它们可以让框架更具有扩展性同时也减少了开发成本、增加了可维护性。比如观察者模式消息的发布、订阅、触 发、中介者模式直接通信的类转化为中间类来处理隔离耦合、外观模式提供一个简单的接口出来在内部进行大量的封装这样就可以起到易用且功能强 大的目的、装饰模式原来已经稳定的功能模块如果在不改变原有结构的基础上进行扩展无疑这是一个很好的实践等。 总结 上篇WPF企业内训全程实录上主 要讲解历史渊源、概念引入、基本阐述以及WPF的每个知识点。这篇主要主要围绕WPF开发模式、WPF团队协作和MVVM框架三个议题进行阐述。下篇将着 重强调结合其他技术共同打造WPF项目、相关性能优化、以及部署与更新问题所以敬请期待另外如果有不懂的地方也可以参考之前写的WPF 基础到企业应用系列最后声明一下由于圣殿骑士才识浅薄所以以上观点只是个人的看法与心得遗漏和错误之处也敬请海涵。怀着技术分享与交流的态度分享出来希望各位多多指教