在MVP中放置View逻辑的位置?

时间:2016-05-01 13:17:28

标签: asp.net mvp webformsmvp

所以我在ASP.NET webforms中实现了MVP。

我需要能够根据某些数据的状态更改标签的颜色。

我的第一次尝试:

class Presenter
{
    ...
    _view.IsStatusTrue = true;
}

class View
{
    bool IsStatusTrue
    {
        set
        {
            if(value)
            {
                lbl.Text = "Status is true :)";
                lbl.CssClass = "trueClass";
            }
        }
     }
 }

我的问题:这个逻辑应该在Presenter中吗?

class Presenter
{
    ...
    if(status == true)
    {
        _view.LblCssClass = "trueClass";
        _view.StatusText = "Status is true :)";
    }
}

1 个答案:

答案 0 :(得分:2)

你的帖子标题确实是自我回答,这是观点责任。我用Java开发了一个家庭宠物MVP框架项目,该框架的核心是独立于平台的,以及我使用该框架的应用程序。这让我有很多目标平台/应用程序视图的实现:Swing(类似于.NET世界的WinForms),GWT(Java到JavaScript基础架构),JSF(~ASPF MVC),Android,JavaFX(~WPF) ),Lanterna(文本模式用户界面)和纯CLI(命令行界面)。想想您的演示者,好像他们都完全独立于平台。从这个角度来看,你的第一个例子比第二个例子好。它给出了什么:

  • 这意味着该视图不会显示它如何报告状态。这使得演示者可以尽可能少地了解视图。一个简单的boolean IsSuccessful{ set; }足以报告状态。如果你揭示它的组件,那么你真的违反了封装。
  • 如果您的演示者与平台无关,您可以在平台上轻松地对它们进行单元测试,而不是启动目标运行时甚至不引用目标运行时库,因此它们是纯粹的。在这种情况下,您只需要模拟您的视图。
  • 您可能希望将一些基本代码移植到另一个运行时,而不一定是ASP.NET。让我们说,WinForms。介绍它的第二个例子是行不通的(例如trueClass不能应用于WinForms,对吧?)。请考虑以下代码:
public sealed class CliView
        : AbstractCliView, // just an example, it might containt CLI-related stuff
          IStatusView {

    public boolean IsSuccessful {
        set {
            Console.ForegroundColor = value ? ConsoleColor.Green : ConsoleColor.Red;
            Console.WriteLine(value ? "success" : "FAILURE");
            Console.ResetColor();
        }
    }

}

这是可能的,因为在第一种情况下,您封装如何实现视图,而不是揭示实现细节。如果你想有一天支持音频接口怎么办? :)