prism v2正式版本已经发布,有兴趣的可以去研究一下.框架给了我们一些实用的功能参考,并不代表实际开发就不会遇到问题。有些人以为只要套用了框架,开发效率就会提升很好,就好比有人以为只要我掌握了设计模式,开发效率会提升一样。框架只是为我们解决一部分常用的问题.但对于不同系统的设计总有些不同.本篇将讨论在wpf中主要使用了一些设计方法.
一.Model-View-Presenter
MVP模式现已经非常常用,如果你不熟悉请参考此文MVP 模式实例解析,我把我自己理解的相关类列出来.
我来介绍一下流程(下为博客园登录界面)
1.抽象View成员 LoginView是一个UserControl,将界面上的属性抽象出来,定义成一个ILoginView接口.
2.在LoginView初始化时,同时初始化LoginViewPresenter,可调用Initialize方法做一些初始化工作(这里可知道,View是知道LoginViewPresenter存在的,同时LoginViewPresenter又可以调用LoginView的相关属性和方法).
3.当触发登录事件时,LoginViewPresenter将会调用ValidateLogin方法来验证View的UserName和Password.
4.ValidateLogin方法将会牵涉到数据库的一些操作,所以把这部分的操作分离到Controller中(即Service).
5.验证完成后再通知LoginView的验证结果以便更新界面信息.
以上为基本的步骤,实际操作起来并非简单,重点在于如何把职责分明确,同时使用此模式也希望能更加的简便.
MVP模式与asp.net
上面的应用假设是应用于web系统,则依赖于asp.net的WebForms(WebForms很适合这样的操作),实际中却不现实,asp.net mvc模式相对而言就比较容易,其做了相对多的封装.WebForms则模拟的web的无状态,MVP会依赖于asp.net控件,使得开发者无法认识web的本质(html,css,javascript), 陷入模式中无法自拔.所以我个人并不是非常推荐,当然还是要看具体场合.
以上简单介绍了MVP模式的基本应用,等下我们来看一下其在wpf中的应用.
二.Presentation Model
1.Model与View的演变
在上面MVP模式,我们并没有说到Model,Model是什么?
ILoginView视图中的两个属性是我们需要的属性,视图是最容易发生变化的地方,随着视图的电话,IView和Presenter也要跟着发生变化,如,这里我把UserName更改为FirstName和LastName拼成一个UserName.现在我把这些属性单独提取出来,现在变更如下.
这里的Model是根据特定View而定的,所以也会随着View的变化而发生变化.这个Model被称为Presentation Model
传统的MVC中的Model一般指数据层的对象,两者是不同的.
以上的变化在很多情况下也是不确定的,因为随着View的变化,View可以做出一些封装(如封装FirstName和LastName两个字段,View的做法有很多)让Model不发生变化,由于视图存着一些不确定因素,比如技术问题,就不得退而求其次,改Model.这个问题是确实存在的.
三.基于技术的基础上变更模式Model-View-ViewModel (MVVM)
以上的变更,并非毫无意义,很多模式都是因为框架提供一些特定的技术而演变出来的,这里也不例外的.数据绑定技术在.net中应用的非常广泛。asp.net,winfrom和wpf均有数据绑定技术,视图是没有方法的,只由控件组成,我们就是要抽取这些控件的属性而定义这个Model,然后将控件的属性与Model属性绑定起来,以便视图和Model双方发生变化时能相互通知(绑定比赋值更简单,更容易让人接受,简化了工作)
下图表示了View与Model之间的关系,两者的变化是双向绑定的.
如果你开发过wpf或者silverlight程序,相信你已经领略过其数据绑定的强大之处,这样的做法用在wpf技术上,恰到好处.
模式只是一种想法,需要通过技术来实现(就如很多人知道mvc模式一样,但并非每个人都能做出像asp.net mvc这样的框架的),wpf的数据绑定与Presentation Model相集合是非常好的做法,使得开发人员可以将View和逻辑分离出来,但这种数据绑定技术(简单实用)是wpf特有的,所以我们又称之为Model-View-ViewModel (MVVM),很多人搞不清楚MVVM与Presentation Model的区别,其实脱离了技术,两者毫无区别,我们可以理解为基于wpf的数据绑定技术的Presentation Model称之为为Model-View-ViewModel (MVVM),这也是我个人的理解,如有不同意见或我理解错误请下面提出来.