【问题标题】:Is There Any Advantage in Passing a UI wrapper to a view将 UI 包装器传递给视图有什么好处吗
【发布时间】:2008-09-17 22:45:33
【问题描述】:

我见过的大多数 MVC 示例都像这样将视图实例传递给控制器​​

public class View  
{  
Controller controller = new Controller(this);  
}

传递一个只提供对控制器感兴趣的属性和事件的访问的类有什么好处,如下所示:

public class UIWrapper
{
private TextBox textBox;

public TextBox TextBox
{
get {return textBox;}
}

public UIWrapper(ref TextBox textBox)
{
this.textBox = textBox;
}


public class View
{
UIWrapper wrapper = new UIWrapper(this);
Controller controller = new Controller(wrapper)
}

【问题讨论】:

    标签: design-patterns oop


    【解决方案1】:

    这取决于您的架构。如果你们都在同一层,那么你可以不使用包装器,尽管我可能会将 View 实现的接口传递给 Controller。在功能上,从耦合的角度来看,接口方法和包装器方法是等价的。

    但是,如果 UI 位于一层而控制器位于另一层,则传递/序列化整个 View 对象可能会很尴尬,甚至效率低下。在这种情况下,您可能希望来回传递 DTO,这样更容易序列化并且可能更高效。

    我倾向于使用 DTO 方法,因为如果您的架构扩展,您需要做的就是序列化和反序列化。

    另外,如果您的 View 很复杂并且有大量数据要与 Controller 来回传递,您可能会开始使用 Introduce Parameter Object 来对抗 Long Parameter List 的味道,这实际上是一个 DTO。

    还有一点需要注意:对于复杂的 View,Controller 最终需要将大量数据映射到 View 中的各种文本框和其他 UI 控件。反过来也是一样:View 最终会从大量控件中获取数据并将它们传递给 Controller 中的各种方法。

    我喜欢将这两者分开。我给 Views 一个 DTO,我认为 View 的工作就是知道在哪里“插入”和“拔出”每条数据。就数据而言,View 和 Controller 现在都只与 DTO 耦合。

    【讨论】:

      【解决方案2】:

      Jeremy Miller 有一系列关于 MVC/MVP 三元组的好帖子。特别是您可能对part 6 感兴趣,它详细介绍了视图和控制器之间的通信。

      【讨论】:

        猜你喜欢
        • 2023-03-02
        • 2014-04-08
        • 2020-10-29
        • 2018-06-27
        • 2015-11-24
        • 2012-03-12
        • 1970-01-01
        • 1970-01-01
        • 2012-12-13
        相关资源
        最近更新 更多