【问题标题】:Implementation differences between MVP Passive View and Supervising Controller for collectionsMVP Passive View 和 Supervising Controller 的集合实现差异
【发布时间】:2011-11-29 14:39:11
【问题描述】:

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

假设我们正在构建一个简单的 WinForms 应用程序,该应用程序由一个表单中的 DataGrid 组成,数据模型是一个简单的东西集合,其中这些东西有一堆属性,视图将实际显示他们:

型号

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&lt;People&gt; ListOfPeople getter 上实现什么,以及我应该如何调用 Presenter 的 UpdateView()

一般来说,为了分别实现 MVP Passive ViewSupervising Controller,有哪些额外的 Presenter 方法会很有趣?

我们真诚地感谢任何建议、代码风格审查或意见。非常感谢。

【问题讨论】:

    标签: design-patterns mvp passive-view supervisingcontroller


    【解决方案1】:

    首先,你应该选择一种模式:

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

    我已收藏all aspects as well as links to useful considerations and examples

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

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

    其次,要明确数据映射:PeopleView应该显示一个人的列表还是几个人的列表? DataGridView 可以每行显示一个人,也可以每行显示一个人。如果每行显示一个人,则可以通过以下方式之一实现对人的处理,例如:

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

    【讨论】:

      【解决方案2】:

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

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

      希望对你有帮助。

      【讨论】:

      • 是的,我目前正在尝试使用 Passive View 接口的 MVPVM 来尝试并鼓励 TDD,但同时有一个 ViewModel 来处理 DataGridViews。
      猜你喜欢
      • 1970-01-01
      • 2011-01-27
      • 2018-08-03
      • 1970-01-01
      • 2011-07-11
      • 2017-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多