在桌面(WinForms)和Web(ASP.NET)解决方案上应用MVP模式的最简单方法

Nan*_*ada 3 asp.net mvp design-patterns winforms c#-4.0

几乎没有架构经验,我正在尝试为.NET 4平台设计一个DRY KISS解决方案,采用MVP方法,最终将实现为桌面(WinForms)和Web(ASP.NET或Silverlight)产品.我曾经做过一些MVC,MVVM的工作,但由于某种原因,我很难绕过这个特定的一个,所以为了抓住模式,我决定从最简单的样本开始问你们一些帮助.

所以假设一个非常简单的模型如下(在实践中它绝对是一个WCF调用):

internal class Person
{
    internal string FirstName { get; set; }
    internal string LastName { get; set; }
    internal DateTime Born { get; set; }
}

public class People
{
    private readonly List<Person> _people = new List<Person>();
    public List<Person> People { get { return _people; } }
}
Run Code Online (Sandbox Code Playgroud)

我在想:

  1. 对于控制台和表单UI,实现其相应的View/Presenter三元组(和助手)的最通用方法是什么?
  2. 哪些应该声明为接口,哪些作为抽象类?
  3. 命令始终是层之间建议的通信方式吗?

最后:任何机会都有一个完善的,可测试的,轻量级的框架来实现这一目标吗?

小智 5

我编写了许多需要GUI和winforms UI的应用程序,我通常用来实现MVP的方法是创建一个通用的视图接口(你可以将它子类化为更具体的视图)和一个给出的控制器基类一个看法.然后,您可以创建从IView(或更具体的视图)接口继承的不同视图实现

interface IView
{
    event EventHandler Shown;
    event EventHandler Closed;

    void ShowView(IView parentView);
    void CloseView();
}

class ControllerBase<T> where T: IView
{
    private T _view;

    public ControllerBase(T view)
    {
        _view = view;
    }

    public T View
    {
        get { return _view; }
    }

    public void ShowView(IView owner)
    {
        _view.ShowView(owner);
    }

    public void ShowView()
    {
        ShowView(null);
    }

    public void CloseView()
    {
        _view.CloseView();
    }
}
Run Code Online (Sandbox Code Playgroud)

下面是一个如何在特定情况下工作的例子

interface IPersonView: IView
{
    event EventHandler OnChangeName;
    string Name { get; set; }
}

class PersonController: ControllerBase<IPersonView>
{
    public PersonController(string name,IPersonView view) : base(view)
    {
        View.Name = name;
        View.OnChangeName += HandlerFunction;
    }

    private void HandlerFunction(object sender, EventArgs e)
    {
        //logic to deal with changing name here
    }
}
Run Code Online (Sandbox Code Playgroud)

要在winforms中实现此视图,只需确保您的表单继承自IPersonView并实现所有必需的属性/事件,您就可以开始使用了.要实例化视图/控制器,您需要执行以下操作

PersonForm form = new PersonForm();
PersonController controller = new PersonController("jim",form);
controller.ShowView();
Run Code Online (Sandbox Code Playgroud)