代码之家  ›  专栏  ›  技术社区  ›  John Leidegren

视图应该如何在MVP模式中吸引演示者

  •  0
  • John Leidegren  · 技术社区  · 16 年前

    我有一个ASP.NETWebForms应用程序,我在视图中使用一些动态控件,这些控件依赖于演示者公开的内容。在这种情况下,视图可以拉上演示者来获取数据吗?在考虑可测试性和松耦合设计时,有什么我应该特别小心的吗。

    编辑

    当我的具体视图命中Init事件时,它将拉动presenter以获取一个集合,该集合将导致创建一组ASP.NET服务器控件。我想知道这是不是一件特别不好的事。。。演示者不知道如何响应页面生命周期init事件,但如果要用动态控件填充视图,则必须这样做。

    2 回复  |  直到 16 年前
        1
  •  1
  •   Jeff Sternal    16 年前

    这是一个令人烦恼的问题-当您想要在ASP.NET web窗体中使用动态控件时,您必须从两个缺点中选择较小的一个。归根结底,这取决于您要做出的妥协:视图中的presenter关注点或presenter中的view关注点。

    当我在web窗体中工作时,我通常更喜欢后者—我接受演示者与ASP.NET页生命周期绑定,并创建一个 InitializeView 方法来执行创建动态控件所需的操作:

    // Presenter
    // This could also be parameterless if you prefer that idiom but 
    // then the view needs a SelectedState property that serves up values
    // straight from the Form collection, and it won't be obvious why.
    public void InitializeView(string selectedState) { 
        if (selectedState != null) {
            view.Counties = dataLayer.GetCounties(selectedState);
        }
    }
    
    // View
    protected void Page_Init(object sender, EventArgs args) {
        presenter.InitializeView(Request.Form["StateList"]);
        // ... build counties drop-down ...
    }
    

    当然,这将演示者的语义与ASP.NET生命周期联系起来,并掩盖了该方法中发生的事情。你可以通过给予 更具描述性的名字,比如 ProcessSelectedState ,但除非方法名引用了页面生命周期,否则永远不会明白为什么您不只是使用模型的其余部分(在 presenter.LoadModel

    我可以看出替代方案的吸引力:

    protected void Page_Init(object sender, EventArgs args) {
        if (Request.Form["StateList"] != null) {
            List<string> counties = presenter.GetCounties(Request.Form["StateList"]);
            // ... build counties drop-down ...
        }
    }
    

    语言的语义 Presenter 非常清楚-很容易理解 GetCounties 与页面生命周期无关。但是你的视图中有可测试的东西,这是一个糟糕的东西,这对我来说通常比让我的演示者不知道他们的视图引擎更重要。

    另一种选择是只加载 页面初始化期间的模型。您的服务器控件值将不可用,因此您必须从 Request.Form . 不过,这并不是典型的ASP.NET,因为大多数web窗体开发人员习惯于直接从web控件获取值,而不是直接从POST数据获取值,这可能会造成过度的混乱。

        2
  •  0
  •   BlackICE    16 年前

    在IMO中,presenter是视图应该从/绑定到/等获取数据的地方。presenter是将要进行单元测试的部分。从你的第二个声明听起来你可能需要多个演示者为这个页面,但我需要更多的细节来确定。

    推荐文章