集合的MVP被动视图和监督控制器之间的实现差异

时间:2011-10-02 23:58:25

标签: design-patterns mvp passive-view supervisingcontroller

我已经开始围绕整个 MVP 模式,尽管我对单个对象做得很好,但在集合方面却开始变得困难。

所以假设我们正在构建一个简单的WinForms应用程序,它由一个Form中的DataGrid组成,数据Model是一个简单的东西集合,其中这些东西有很多属性,而View实际上会显示它们:

模型

public class Person
{
    public string Name { get; set; }
    public DateTime Birth { get; set; }
    public bool IsCool { get; set; }
}

public class People
{
    public List<Person> Persons { get; set; }
}

查看

public interface IPeopleView
{
    List<People> ListOfPeople { get; set; }
}

public partial class PeopleViewImpl : Form, IPeopleView
{
    private DataGridView _grid = new DataGridView();

    public PeopleViewImpl()
    {
        InitializeComponent();
    }

    // Implementation of IPeopleView
    public List<People> ListOfPeople
    {
        get { return /* TODO */; }
        set { _grid.DataSource = value; }
    }
}

演示

public class PeoplePresenter
{
    private People _model;
    private IPeopleView _view;

    public PeoplePresenter(People model, IPeopleView view)
    {
        _model = model;
        _view = view;
    }

    void UpdateView()
    {
        _view.ListOfPeople = _model.Peoples;
    }
}

那么我应该在View的List<People> ListOfPeople getter中实现什么,以及我应该如何调用Presenter的UpdateView()

通常,为了分别实现MVP 被动视图监督控制器,哪些额外的Presenter方法会很有趣?

任何建议,代码风格评论或意见将得到真诚的感谢。非常感谢。

2 个答案:

答案 0 :(得分:6)

首先,您应该决定使用一种模式:

  • 如果您想利用数据绑定并且有自动视图测试工具可用,则监督控制器是合适的
  • 如果您的视图数据变得更复杂或者您必须依靠纯单元测试来获得完整视图,则会显示被动视图
  • 演示模型(也称为模型视图ViewModel)非常适合您需要轻松访问完整视图状态以及是否可以生成代码

我收集了all aspects as well as links to useful considerations and examples

在任何一种情况下,您都应该定义PeopleModel并让PeopleViewImplementation引用PeopleModel。这清楚地将模型与视图区分开来。

在集合方面,监督控制器可以依赖列表与DataGridView的数据绑定。见winForms + DataGridView binding to a List。只有被动视图和演示模型需要额外的代码才能将列表分别映射到视图字段到演示模型。

其次,应澄清数据映射:PeopleView是否应显示人员名单或若干人民名单? DataGridView可以每行显示一个人,也可以每行显示一个人。如果每行显示一个人,可以通过以下方式之一来实现对人的待遇,例如:

  • 在一个页面上显示一个人的所有人,并添加一个寻呼元素以在不同的人之间导航
  • 在数据网格中显示一个人的所有人,并为人们添加选择小部件,例如与所有人民共存的树
  • 在数据网格中混合不同人的人,并添加一列以显示每个人的人

答案 1 :(得分:2)

我的建议是为该集合设置一个ViewModel。视图实现将负责创建新实例并更新旧实例,但它不会触及实际模型的任何内容。为了检索它们,只需迭代行创建新的。最后,演示者将迭代该集合并创建/更新模型的每个成员。 (我还建议使用IEnumerable&lt;&gt;并使用yield return,因此集合只迭代一次)。

为了显示数据,您还可以使用此ViewModel(因此它将保持一致)或仅使用实际模型(以只读方式),如果由于某种原因它们不同(可能您显示的信息比您可以显示的更多)编辑)。

希望它有所帮助。