读物推荐

谈到Model View Presenter模式之后的随笔[讨论版]

       ModelViewPresenter 模式已经推出快二年了吧,今天公司新的兄弟,午饭时和我谈到有关于在项目中是否可以使用MVP模式,然后呼啦啦和我讲了许多,我听了蛮有感处的,但结果让这位兄弟写的时候,他却写了大半个下午,还没个MVP影子,Jezz!  我只好花上10几个分钟的时间写了一个Demo。
        本来想不发到Blogs中,但是还是和大家分享一下,
        第一,让初学者有关的例子可以参照,毕竟读代码,要比看书有感觉,
        第二,也可以让高手们指点指点,有哪些不足,然后看看高手们能不能就有关于MVP模式,在项目中的应用谈谈他们的看法。
        第三,有关于MVP模式的文章cnblogs中好像很少,因为我只看到过两篇,一篇是介绍MVP模式的,一篇是翻译的吧。
   *嗯,不管大家对以下的代码部分有什么疑义,都可以进行评论,希望可以达到共同学习,互相学习的目的,评出你的观点,说出你的理解。
                                                     (希望不要说粗口,这样就不好了。)

以下是代码部分:

ModelLayer:


namespace MVPDesign.ModelLayer
{
    
public class XmlData
    
{
        
/// <summary>
        
/// 根据Id取得Xml中的数据
        
/// </summary>
        
/// <typeparam name="T">返回的Type</typeparam>
        
/// <typeparam name="V">Id的Type</typeparam>
        
/// <param name="id"></param>
        
/// <returns>XmlData</returns>

        public static T GetDataById<T, V>(V id) where T : XmlData
        
{
            XmlDocument xmldocument 
= new XmlDocument();

            xmldocument.Load(
"XmlData.xml");
            String path 
= "/XmlData/Data[@id={0}]/{1}";
            XmlNode titleNode 
= xmldocument.SelectSingleNode(String.Format(path, id, "Title"));
            XmlNode textNode 
= xmldocument.SelectSingleNode(String.Format(path, id, "Text"));

            XmlData xmlData 
= new XmlData();
            xmlData.title 
= titleNode.InnerText;
            xmlData.text 
= textNode.InnerText;
            
return xmlData as T;
        }


        
internal String title;
        
/// <summary>
        
/// 相对应于XML文件中的Title
        
/// </summary>

        public String Title
        
{
            
get return title; }
        }


        
internal String text;
        
/// <summary>
        
/// 相对应于XML文件中的Text
        
/// </summary>

        public String Text
        
{
            
get return text; }
        }

    }

}


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


    
public class DataPresenter
    
{
        
internal readonly IDataView view;

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

        
public void RetrieveData()
        
{
            XmlData myPost 
= XmlData.GetDataById<XmlData,Int32>(view.DataId);
            view.Title 
= myPost.Title;
            view.Text 
= myPost.Text;
        }

    }

}

PresenterLayer:
using MVPDesign.ViewLayer;
namespace Presenter
{
    
public partial class PresenterLayer : Page, IDataView
    
{
        
private 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; }
        }

    }

}


XMLFile:
<?xml version="1.0" encoding="utf-8" ?>
<XmlData>
    
<Data id="1">
        
<Title>Linq</Title>
        
<Text>Linq To Memery Object</Text>
    
</Data>
    
<Data id="2">
        
<Title>BLinq</Title>
        
<Text>Linq To Web</Text>
    
</Data>
    
<Data id="3">
        
<Title>XLinq</Title>
        
<Text>Linq To Xml</Text>
    
</Data>
    
<Data id="4">
        
<Title>DLinq</Title>
        
<Text>Linq To DataBase</Text>
    
</Data>
    
<Data id="5">
        
<Title>SLinq</Title>
        
<Text>Linq To Stream</Text>
    
</Data>
</XmlData>

PresenterForm:
<form id="form1" runat="server">
    
<table style="width: 659px; height: 481px">
        
<tr>
            
<td style="width: 178px">
                
<asp:Label ID="lblChoose" runat="server" Text="Please Choose ,Feeling MVP" Width="195px"></asp:Label><br />
                
<asp:DropDownList ID="DDL" runat="server" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged" AutoPostBack="True">
                    
<asp:ListItem Text="Please Choose Option" Value="0"></asp:ListItem>
                    
<asp:ListItem Text="Linq" Value="1"></asp:ListItem>
                    
<asp:ListItem Text="BLinq" Value="2"></asp:ListItem>
                    
<asp:ListItem Text="XLinq" Value="3"></asp:ListItem>
                    
<asp:ListItem Text="DLinq" Value="4"></asp:ListItem>
                    
<asp:ListItem Text="SLinq" Value="5"></asp:ListItem>
                
</asp:DropDownList>
            
</td>
            
<td>
                
<asp:Label ID="lblDisplayTitle" runat="server" Text="DisplayTitleFromXml"></asp:Label><br />
                
<asp:Label ID="lblTitle" runat="server" Font-Size="Larger" ForeColor="Red"></asp:Label>
            
</td>
            
<td>
                
<asp:Label ID="lblDisplayText" runat="server" Text="DisplayTextFromXml"></asp:Label><br />
                
<asp:Label ID="lblText" runat="server" Font-Size="Larger" ForeColor="Blue"></asp:Label>
            
</td>
        
</tr>
    
</table>
    
</form>

程序最终运行截图:


嗯,差不多,写完了。
posted @ 2007-09-26 21:26 BrianLei 阅读(2087) 评论(29)  编辑 收藏 网摘 所属分类: Asp.Net

  回复  引用  查看    
#1楼 2007-09-26 21:39 | 菌哥      
文章不错,但代码的字体看起来比较费劲,能否改成一般的字体,谢谢!
  回复  引用  查看    
#2楼 2007-09-26 21:40 | Clingingboy      
呵呵,mvp可以借助工具来实现
  回复  引用  查看    
#3楼 2007-09-26 21:41 | Clingingboy      
可以参考Web Client Software Factory,我们项目也在用,可参阅msdn的文章.
  回复  引用    
#4楼 2007-09-26 22:03 | uvc [未注册用户]
这就是MVP吗?那个ViewLayer倒像是一个service,也搞不懂什么职责应该放在ViewLayer,什么应该放在PresenterLayer里面,这个在开发过程中应该会混乱的。

倒觉得这不是MVC的进化,而跟刚开始微软推荐的多层架构有点类似,那个没用好的原因就是职责混乱了,编码繁琐了点
  回复  引用    
#5楼 2007-09-26 22:57 | cnodin [未注册用户]
楼上的是想芙蓉吗?
  回复  引用    
#6楼 2007-09-26 23:11 | saucer [未注册用户]

好像有点问题吧,所谓的Presenter应该是类似控制器这样的东西,即DataPresenter应该属于Presenter层,而ASPX页面属于View层

ViewLayer:
namespace MVPDesign.ViewLayer
{
public interface IDataView

public partial class YourPage : Page, IDataView
}

PresenterLayer:
namespace Presenter
{
public class DataPresenter
}

参考
http://www.codeproject.com/aspnet/ModelViewPresenter.asp

  回复  引用  查看    
#7楼 [楼主]2007-09-26 23:22 | BrianLei      
@亚历山大同志,
不是吧,你也说粗口。这是会影响大家到你的印象的。高手一般不会这样轻浮的,希望可以改口。
  回复  引用    
#8楼 2007-09-26 23:29 | cnodin [未注册用户]
亚历山大同志这孩子帐号是不是被盗了啊。感觉他应该没有这么不堪呐。
  回复  引用    
#9楼 2007-09-26 23:32 | cnodin [未注册用户]
“亚历山大同志,”,原来是多了个逗号,呵呵,眼拙了。这样玩有意思么,无聊。
  回复  引用  查看    
#10楼 [楼主]2007-09-26 23:39 | BrianLei      
@cnodin
@亚历山大同志,
我也很奇怪啊,难得“亚历山大同志”与“亚历山大同志,”不是一个人吗?

  回复  引用  查看    
#11楼 2007-09-26 23:40 |       
@亚历山大同志,
看来亚tx树大招风,又有人开始冒充抹黑了。

召唤dudu,把冒充者踢出去
  回复  引用  查看    
#12楼 2007-09-27 06:58 | 菌哥      
思归的方法才是MVP
  回复  引用  查看    
#13楼 2007-09-27 08:11 | 阿布      
这人真无聊,怕是踢不出去,因为人家是是未注册,只是冒充个名字
  回复  引用  查看    
#14楼 2007-09-27 08:19 | 杨其仲      
@亚历山大同志,
这样好玩吗? 申请的号被DUDU删了,还要冒充,你也太.........
  回复  引用    
#15楼 2007-09-27 08:20 | xhouse [未注册用户]
感觉举例就应该举一个比较通用的例子,你弄一个特定平台的特定代码,这样的demo就降低了它的通用性,价值反而不高。一家之言。
  回复  引用  查看    
#16楼 2007-09-27 08:36 | henry      
有兴趣看下这个是不是你们说的MVP :)
http://www.nclay.cn/UserFiles/admin/File/SmallyBlogApp.rar
  回复  引用  查看    
#17楼 2007-09-27 09:16 | 周银辉      
good
  回复  引用  查看    
#18楼 2007-09-27 09:16 | 麒麟.NET      
我倒是很喜欢楼主的这个英文字体,请问是什么字体?:)
  回复  引用    
#19楼 2007-09-27 09:29 | dali [未注册用户]
我觉得MVP模式完是理化的方法, 在实际工作上完全不可能用, 试想asp.net的控件和winform的控件差别还是很大的,不可能完全一致
  回复  引用  查看    
#20楼 2007-09-27 09:49 | 紫色阴影      
@麒麟.NET
应该是Comic Sans MS,我也喜欢用
  回复  引用    
#21楼 2007-09-27 10:01 | 空明流转的马甲 [未注册用户]
一早就发现了“亚历山大同志,”,而且还是个未注册。。。这年头马甲真是哪里都有。。。在cnblogs出现这样的事件简直就是cnblogs的耻辱啊。。。唉。。。
  回复  引用  查看    
#22楼 2007-09-27 10:11 | 紫色阴影      
同意思归说的
  回复  引用    
#23楼 2007-09-27 12:02 | rocklau [未注册用户]
我最郁闷,他最少还有个马甲,我呐,,申请帐号N次 都大半年了,也没给通过.

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

http://msdn.microsoft.com/msdnmag/issues/06/08/DesignPatterns/default.aspx
  回复  引用    
#26楼 2007-09-27 21:50 | w [未注册用户]
同意你的观点
  回复  引用  查看    
#27楼 2007-09-28 01:51 | Jeffrey Zhao      
用MVP开发过一定规模的项目之后会发现,很多时候严谨的MVP是需要妥协的。
  回复  引用  查看    
#28楼 2007-09-29 10:25 | 镜涛      
能不能对MVP和MVC做一个对比呢?
  回复  引用  查看    
#29楼 [楼主]2007-09-29 10:52 | BrianLei      

标题  
姓名  
主页
Email (博主才能看到)