c# - 这是一个有效的 MVP 模式实现吗

标签 c# asp.net .net design-patterns mvp

我在这里尝试分析一些使用 MVP 方法设计的代码。没有使用特定的 MVP 框架。这都是手写代码。

//Interface Representing our View
public interface IFooView
{
   string SomeScreenValue
}

//Presenter Implementation
public class FooPresenter 
{
    private readonly IFooView _view;

    public FooPresenter (IFooView view) 
    {
        //The presenter gets instantiated with a reference to a view.
        _view = view
    }

    public void SomeButton_Click(object sender, EventArgs e)
    {
        _view.SomeScreenValue = "The Result";
    }
}

//The Page Implementation
public class FooPage : System.Web.UI.Page, IFooView
{
    private FooPresenter _presenter;

    protected void Page_Init(...)
    {
        _presenter = new FooPresenter(this);  
        //<-- The View has a Presenter, which references the same View...
        Button1.Click += new EventHandler(_presener.SomeButton_Click);
    }
}

它的工作原理是它允许开发人员将业务逻辑从代码后面移到类中,同时仍然影响 View 。但是缺少实际模型,以及设置 View => Presenter => View 关系的方式对我来说有点令人厌烦?

那么上述情况是否是 MVP 模式的有效实现?

最佳答案

几乎是 MVP,因为您的 Presenter 与 View 分离,当它更新 UI 状态时,它通过 IFooView 接口(interface)进行更新.但是,在您的演示者中使用符合标准 .NET 事件处理程序的方法对我来说似乎是错误的。我会让 IFooView 在按钮单击发生时引发事件,然后您的页面可以像您当前一样执行处理按钮单击的任务,然后引发您的 Presenter 处理的事件。此事件可以与域更密切相关,例如,您可能希望通过 IFooView 公开诸如 RecordUpdated 之类的事件。

这将使为单元测试提供 IFooView 的模拟实现变得更加容易,这毕竟是使用 MVP/MVC/MVVM 模式的一大优势。

如果您没有来自后端服务或数据库的任何数据,那么对于简单的应用程序,Presenter 也可以承担模型的角色。在您的简单示例中就是这种情况。同样可以在 MVVM 中完成,其中 ViewModel 也可以承担模型的职责。但是,如果您做任何重要的事情,我建议您创建一个模型。在您的情况下,Presenter 将委托(delegate)模型维护状态,并使用某种“服务”来保存对此模型的更改,或从 Web 服务检索模型对象。

关于c# - 这是一个有效的 MVP 模式实现吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8985380/

相关文章:

c# - 如何处理大对象?

javascript - 提交按钮不会调用该操作

c# - 如何在调试时使用 ToString 以外的委托(delegate)来显示对象的值?

c# - 是否可以在不使用任何实际电子邮件帐户的情况下以编程方式发送电子邮件

c# - 如何在 Windows 10 XAML 中模糊图像?

c# - 如何在 C# 中将大二进制字符串转换为十六进制字符串格式?

c# - 当子实体有多个路径时,如何生成对象?

C# - @if 内有未封闭的 HTML 元素时出现 System.Web.HttpParseException 错误

c# - 如何从 GridView 在新选项卡中打开页面?

.net - 在云环境中记录 .NET 异常和消息有哪些选项?