将UI包装器传递给视图有什么优势

时间:2020-03-06 14:19:17  来源:igfitidea点击:

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

解决方案

杰里米·米勒(Jeremy Miller)关于MVC / MVP三合会的帖子很多。特别是我们可能对第6部分感兴趣,它详细介绍了视图和控制器之间的通讯。

这取决于体系结构。如果我们都在同一层上,那么我们可以不用包装器,尽管我可能会将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。