将UI包装器传递给视图是否有任何优势

时间:2008-09-17 22:45:34

标签: design-patterns oop

我见过的大多数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)
}

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

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

此外,如果您的视图很复杂并且有很多数据要与Controller来回传递,那么您可能会开始使用Introduce Parameter Object来对抗长参数列表气味,这实际上是一个DTO。< / p>

还有一件事需要你去咀嚼:对于复杂的View,Controller最终需要将大量数据映射到View中的各种文本框和其他UI控件。反之亦然:View最终从许多控件中获取数据并将它们传递给Controller中的各种方法。

我喜欢分开这两个。我给了视图一个DTO,我认为View的工作就是知道在哪里“插入”并“插入”每个数据。就数据而言,View和Controller现在只与DTO耦合。