dinghao

记录成长点滴

 

以前的东西-Mvp2

 

看了回复发现有些人对MVP的理解和我的理解有些差别,写了下面的东西。

主要参考了下面几篇文章

http://codebetter.com/blogs/jeremy.miller/articles/129542.aspx

http://codebetter.com/blogs/jeremy.miller/archive/2006/02/01/137457.aspx

http://haacked.com/archive/2006/08/09/ASP.NETSupervisingControllerModelViewPresenterFromSchematicToUnitTestsToCode.aspx

http://www.martinfowler.com/eaaDev/SupervisingPresenter.html

http://www.martinfowler.com/eaaDev/PassiveScreen.html

asp.net中用MVP的原因:

        在软件设计中最重要的一条原则是“分离关注点”,每一段代码有且仅有一个职责,才那能使程序有良好的可维护性。即使在编码的起点,也应该明确一次只解决一个问题,如,我希望只关注业务逻辑而不管数据库结构、html等。

        构建可维护的用户界面代码的传统做法是MVC模式。可惜,asp.netRAD做了优化而没有关注创建可维护性的代码,asp.net模型本身就没有对MVC提供很好的支持,许多asp.net程序把数据访问、html标记、业务逻辑混合在了一起,codebehind模型也没有很好的分离关注点,再加上codebehind很难做单元测试,这些都是要引入MVP的原因。

MVPMVC问题:

        Codebehind的作用?

        CodeBehind不能作为MVC的控制器,他只能作为单纯的View,许多维护问题都是由把Code-Behind作为控制器引起的。在MVPPresenter不能引用System.Web名称空间,是P依赖于V。即使其他的模式也应该尽可能的使Codebehind的只作为界面(View)的辅助,而不包含业务逻辑、控制代码。

   MVPVMVCV的区别?

   VMVP中是界面的非常简单的包装(一定要简单到不涉及逻辑问题),MVCV是指完全被动的。

MVC的类结构

   目的是要把尽可能多的功能从asp.net运行时分离出来,也就是说把Page的职责分解到几个类中:

View:显示数据、把用户输入和触发的事件推迟到Presenter

   通常需要一个接口(Interface),代表所有的View,后台代码把此接口当作界面,而不需要Pagesystem.web中的类,此接口封装了与asp runtime的交互。

界面和后台的逻辑都通过此接口传递信息。

Presenter:协调View和后台服务、业务逻辑,负责页面逻辑。P只能依赖于IViewModle(最好用Facade模式,提供一个中间层,隔离Model)。P的功能不能太多,MVPP负责的一般比MVCC多,但是从功能上细分P到几个类有时是必要的,如验证、分页、排序等,使P不至于便的很大,并且有内聚性。

V的要点:

1、V必须依赖于接口Iview

2、 IView,尽量减少简单的POCO似的属性,而要把这些封装成类或者暴露DTO,甚至MOdle,如

public interface IWorkItemView
        {
               // Packs the user input into a new WorkItem class
               WorkItem WorkItem{get;}
 
               // Sets the values in the dropdown list for the WorkItem assigned to user
               string[] AssignmentList {set;}
 
               // Sets the values in the dropdown list for the WorkItem categories
               string[] CategoryList {set;}
        }
public interface IWorkItemView
        {
               string AssignedTo {get; set;}
               string Category {get; set;}
               string Description {get; set;}
               string Priority {get; set;}
               string Comments {get; set;}
               
                /* More properties */
        }

 

P的要点:

1View可以有多个Presenter,如一个负责低层次的ViewModel映射和验证。另一个Presenter负责业务逻辑和后台服务

后面的找不到了 

 

 

 

posted on 2007-07-17 19:27  思无邪  阅读(676)  评论(0编辑  收藏  举报

导航