1

所以我在 ASP.NET 网络表单中实现 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 :)";
    }
}
4

2 回答 2

2

您的帖子标题确实是自我回答的,这是视图的责任。我用 Java 开发了一个家庭宠物 MVP 框架项目,该框架的核心是独立于平台的,我使用该框架的应用程序也是如此。这让我有许多目标平台/应用程序视图的实现:Swing(类似于 .NET 世界中的 WinForms)、GWT(Java 到 JavaScript 基础设施)、JSF(~ASP.NET MVC)、Android、JavaFX(~WPF )、Lantena(文本模式用户界面)和纯 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();
        }
    }

}

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

于 2016-05-01T16:53:20.837 回答
0
public class Presenter
{
    bool _status;
    IView _view;

    public Presenter(IView view)
    {
        _view = view;

        if (_status)
        {
            _view.LabelColorCode = "#c2d8ff";
            _view.LabelText = "Status is true";
        }
    }
}

public interface IView
{
    string LabelColorCode { set; }
    string LabelText { set; }
}
于 2016-08-11T22:43:00.383 回答