带有webforms和.ascx控件的MVP模式

时间:2014-06-19 11:05:39

标签: asp.net design-patterns webforms mvp

我们假设我有一个名为TrainingPlan的域对象。 TrainingPlan对象由其他域对象组成,如下所示:

public class TrainingPlan
{
    public DelegateInfo DelegateInfo { get; set; }   // name, assessor, course name
    public IEnumerable<Test> Tests { get; set; }     // tests delegate undertook
    public IEnumerable<Comment> Comments { get; set; } // comments by assessor
} 

我创建了3个.ascx控件:

DelegateInfo.ascx

Test.ascx(显示单个测试域对象的信息)

Comment.ascx(显示单个评论域对象的信息)

使用视图声明每个ascx控件:

 public partial class TestControl : System.Web.UI.UserControl, ITestView
 {     
     // ... implementation of view interface here. Simple properties
 }

我的演示者是视图和域对象之间的中间人:

public class TestPresenter: ITestPresenter
{
    ITestView _view;
    ITest _domainObj;   

    // Test object in domain implements ITest
    public TestPresenter(ITestView view, ITest domainObj)
    {
        // removed: checks for null etc

        _view = view;
        _domainObj = domainObj;
    }

    // etc etc

 } 

域对象是将数据提供给演示者的对象,并通过演示者从视图接收更新的输入。它将验证数据(因此它在域层中的原因。)

问题:

  1. 演示者是否在MVP中直接与域对象对话?我已经使用Google搜索并且在示例中,演示者直接访问模型,但是具有内置业务逻辑的域对象呢?

  2. 下面的逻辑是否符合MVP模式?

  3. // Page_Load of PageThatDisplaysTrainingPlan.aspx:  
    // load full trainingPlan object  
    var trainingPlan = repository.LoadTrainingPlan(idOfPlan);  
    // populate test controls  
    foreach(var test in trainingPlan.Tests)  
    {  
        // create test.acx control on this line. Code not added as it is unnecessary  
        var pres = new TestPresenter(controlJustAdded, test);                   
        //  ... add pres to some collection somewhere  
    }
    

    欢迎使用示例代码的任何建议或链接。

1 个答案:

答案 0 :(得分:0)

是的,在MVP模式中,演示者直接使用模型,它绝对正常。具有内置业务逻辑的域对象也是正常的。

关于你的第二个问题 - TestPresenter必须负责从数据库加载trainingPlan对象,以及用新创建的控件更新UI。好像你已将此代码放入Page_Load事件处理程序中,我认为这不是一个好主意,它看起来像SmartUI反模式。