当MVP遇到C

简述:
       看到大家评论的这么多,我目的达到。我放上去的代码,其实是有点值得疑义之处,所以我在标题后加[讨论版]的字样。拿上篇文章中"saucer"评论,他说的没错。其实Model View Presenter也是不固定的,web Client Software Factory使用的就是Mode View Presenter + Controller模式(MVPC模式),当然代码改进是必须的,此篇所表现的Demo,是一个MVP+C模式简易实现,不过因为没有加入Ioc,所以还是有值大家添砖加瓦的地方。ok.

观点认同方面:见贴子底部
      
代码部分:
       首先,先写一段伪代码:
 public interface IView
 {
 }
 public class Presenter
 {
      IView view;
      Controller controller;
 }
 public partial class TestPage: Page, IView
 {
        Presenter presenter;
 }

 public class Controller
 {
        Data data;
 }

 public class Data
 {
 }

那为什么要加上Controller呢?
    一句话:加上Controller可以让多个Presenter 共享DataModel
    那Controller 类中可以包括数据的缓冲,获取和数据的更新etc,其实Controller这时变成一个相对独立的控制器,当然也可以把Controller用作状态控制器
比如:一个Presenter向Controller发送Next(调用Next方法)
    Controller根据当前的状态导航到相应的页面,他就可以通过调用一个导航服务对象来导航,Controller本身并不处理导航,Clear。其实学习完Web Client SofteWare Factory基本就明白了。

PresenterLayer:

namespace MVPDesign.Presenter
{
    
public interface IDataView
    
{
        Int32 DataId 
get; }
        String Title 
set; }
        String Text 
set; }
    }

}


namespace MVPDesign.Presenter
{
    
using MVPDesign.Control;

    
public class DataPresenter
    
{
        IDataView view;
        

        
public DataPresenter(IDataView view)
        
{
            
this.view = view;
        }


        
public void RetrieveData()
        
{
            Controller controller 
= new Controller(view.DataId);
            view.Title 
= controller.Title;
            view.Text 
= controller.Text;
        }

    }

}

ViewLayer:
namespace MVPDesign.ViewLayer
{
    
using MVPDesign.Presenter;

    
public partial class TestPage : Page, IDataView
    
{
        DataPresenter dataPresenter;

        
protected void Page_Load(object sender, EventArgs e)
        
{
            dataPresenter 
= new DataPresenter(this);
        }


        
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
        
{
            dataPresenter.RetrieveData();
        }


        Int32 IDataView.DataId
        
{
            
get return Convert.ToInt32(this.DDL.SelectedValue); }
        }


        String IDataView.Title
        
{
            
set this.lblTitle.Text = value; }
        }


        String IDataView.Text
        
{
            
set this.lblText.Text = value; }
        }

    }

}


ModelLayer: 代码同前篇文章
XML源:同前篇文章

Controller:
namespace MVPDesign.Control
{
    
using MVPDesign.ModelLayer;

    
public class Controller
    
{
        
private int id;
        
        
public Controller(int ID)
        
{
            id 
= ID;
        }

        
        
private XmlData GetXmlData()
        
{
            
return XmlData.GetDataById<XmlData, Int32>(id);
        }


        
public String Title
        
{
            
get return GetXmlData().Title; }
        }

        
        
public String Text
        
{
            
get return GetXmlData().Text; }
        }

    }

}

讨论处[有关于观点认同方面]:

“我觉得MVP模式完是理化的方法, 在实际工作上完全不可能用, 试想asp.net的控件和winform的控件差别还是很大的,不可能完全一致 ” 评论者:dali

@dali
非常同意你的观点,只要界面稍微复杂点,用起mvp来是恼火的.况且lz说的好像也不是真正的mvp,mvp提倡所有的view要实现Iview,而将具体的界面调用委托给展示层,外表上非常的解偶,也就是说以前你winform写的程序,可以很好的转移到webform中,由于展示层和view中的控件已经实现解偶,所以winform和webform中控件的不一致对它的影响非常小,更由于它推荐的是事件委托,所以解偶还算比较彻底.但是,还是那句话,要是界面很复杂呢,比如充斥大量用户自定义控件和服务控件,这时开发起来就比较麻烦,效率会很低.
评论者:hehehe

针对以上所评:首先,我是不怎么同意的;其次,询问经常使用此模式的一些人
    凌说:以上有一点可能不准确,wpf应该在web和winform都是使用一套控件
    niwalker言:以上说法是错误的;不说别的,在我的项目中就已经用过多次mvp和mvpc模式了

嗯,欢迎大家侃侃

posted @ 2007-09-28 10:01  RicoRui  阅读(2419)  评论(2编辑  收藏  举报