随着WPF/Silverlight等技术的出现一种新的模式出现在大家面前那就是MVVM提到这个模式大家也许感觉很迷惑也许会不屑于故也许你会说我现在做项目都形成了自己的框架了为什么还要花费额外的时间和精力去学习这个MVVM模式呀这个模式到底能给我们带来什么样的好处那么我们本篇也会简单提及由于这个会在WPF 基础到企业应用系列索引 里详细讲解所以今天只是走马观花了解一下基本概念。众所周知这个模式大量用在WPF/Silverlight上但没有听说过用在Windows Form、ASP.NET等传统技术上。正是基于这个原因我也对此进行了一些研究做了一些Demo但总体感觉在其他技术上不太适合就一直没有管它了直至有一天看到Bechir Bejaoui 也有这种思想并且他打算在WinForm和ASP.NET项目当中使用这使我感到有必要写一篇这方面的文章看看到底是否可行正是基于这个原因今天我们就用一个简单的例子来谈谈它在WinForm平台的应用看看大家对这个有什么看法.二. 本文提纲· 1.摘要· 2.本文提纲· 3.MVVM基本介绍· 4.WPF/Silverlight项目中如何使用· .WinForm/ASP.NET上使用实践· 6.本文总结三. MVVM基本介绍WPF和Silverlight来了它带来了3D、动画、音频视频……这导致了UI的变化将更加细节化和可定制化。同时在技术层面上WPF和Silverlight也带来了诸如Binding、 Dependency Property、Routed Events、Command、Attached Behavior间接实现、DataTemplate、ControlTemplate等新特性。我们怎样才能立足于原有的技术框架、把WPF/Silverlight的新特性揉合进去以应对客户日益复杂且多变的需求呢那么MVVM模式就是一个不错的选择。在MVVM模式中你需要一个为View量身定制的model那么这个model实际上就是上图ViewModel。ViewModel包含所有UI所需要的接口和属性这样只需要通过Binding使他们进行关联就可以使二者之间达到松散耦合所以这样一来UI就可以由UI专业人员用design和blend来实现当然很多效果还是需要用传统的制图软件代码人员也可以专心写他的逻辑也业务代码所以这样分工和协作变得更轻松、更愉快了更漂亮的是View完全可以由Unit/Automatic Test所取代所以单元测试也变得如此简单这对于我们的开发人员和测试人员无疑是一个很好的解脱同时也提高了系统的可测性、稳定性和维护性。数据绑定系统同时也提供了标准化的方式传输到视图的验证错误的输入的验证但是个人觉得不是很好用所以我们在实际的项目当中会写一套自己的验证框架。当然是用这个模式的时候我们还要注意很多细节这个是我们必须面对的比如我们怎么实现ViewModel之间的通信、怎样用Attached Behavior实现特定命令操作、validation的自定义设置、延迟加载、性能优化、与传统技术的交互等等问题。四. WPF/Silverlight项目中如何使用1.我们的WPF/Silverlight项目前面讲了一些MVVM的基本概念那么我们在WPF和Silverlight中究竟怎么使用呢那么下面就是我们在项目当中的具体使用第一幅图就是整个项目的结构图第二副图是View和ViewModel以及一些常用的UI操作当然这里也可以更加细节化,具体更加实际决定 。上图就是整个项目的结构图上图是View和ViewModel以及一些常用的UI操作由于这个不是今天的重点所以就不在这里阐述以后有空会单独讲解。2.我对架构的一些看法前两天我在一篇叫“ [征集].NET软件设计经验期待你的参与”的帖子中回复了我对项目的一点微薄见解或许很多是自己的一些错误观念但是不交流的话永远就不知道自己是对是错了所以这里也贴出来当然架构设计也不要过度只要适宜即可这也是我现在最大的体会。回顾过去由于项目和公司原因自己零零碎碎的什么都在做什么都不精也不敢在这里谈经验只是自己的体会望各位高手见谅其他平台很菜就不说了对.Net平台感觉刚入门从WinForm、ASP.NETASP.NET MVC一个项目没做完就被终止到WPF和Silverlight以至于到现在做的Windows Azure不论是采用什么技术最基本的东西都不会变比如对数据库、文件和其他设备的访问、对日志和异常的处理、对数据结构的处理、对报表的展现、对打印的实现、对性能的提升、对数据的处理、对用户友好等等。那么这些项目也为我们积累了不少经验有技术上的也有其他方面的* 为了应付项目需求的不断变化和项目的可扩展性我们也会引入OO和设计模式* 为了解除各模块和组件的耦合我们也会利用IOC的思想解耦* 为了让逻辑代码清晰且没有其他代码的干扰我们也会采用AOP的方式进行代码重组* 为了解决诸如莫名奇妙的内存错误、Invoke异常我们也会去研究晦涩难懂的CLRIL,问题出了你负责这个项目必须得解决。* 为了使项目的开发速度更快且更方便我们也会引入ORM思想来加快项目的开发速度和可维护性* 为了更好组织各层开发隔开耦合我们也会采用MVC、MVP、MVVM模式* 为了提升用户的响应速度我们会采用AJAX的方式来实现采用异步编程去解决用户漫长的等待问题* 为了降低系统的负载同时提高用户的响应能力我们也会采用MSMQ或者SSB来组织消息队列* 为了企业业务整合用户只需要登录一次就可以访问所有相互信任的应用系统我们也会写一套自己的SSO* 各种应用程序、各种服务的交错会让我们感到手足无措为了规范各系统的接口提供一个统一的交互平台我们也会采用SOA* 针对大量数据量实时处理、较高计算解除用户等待的漫长等待为了降低服务器的负担和提高速度我们也会自己写一套缓存并保证缓存的正确的更新与去除* 为了把产品做好我们也会不断优化技术直至达到期望的效果* 为了能做好外包项目我们会不需要任何高深技术首先给客户期望的效果* 为了能得到客户满意老板好评我们也会学会如何交流要明白最终是要得到客户的满意度要得到money其实归根到底就是要分清关系理清思绪既要处理好与机器的关系也要处理好与人的关系只有这样才能把产品或者项目做成功项目做成功了才有后面的发展和晋升我也在不断学习当中始终感觉自己是菜鸟回头望去猛然发现自己又回到了原点只有不断学习不断进步了