MVC模式实现。它的组件之间的n关系是什么

时间:2010-03-08 02:02:37

标签: c# model-view-controller design-patterns

我正在C#项目中工作,为了在UI的不同部分得到统一,我们尝试使用MVC模式。客户端是基于Windows窗体的,我正在尝试创建一个简单的MVC模式实现。

这比预期更具挑战性,但我仍然对MVC模式有一些疑问。问题主要来自其组成部分之间的n-n关系:这是我所理解的,但我完全不确定。也许有人可以纠正我?

  • 模型:可以在不同的视图之间共享。模型视图之间的1-n关系
  • 查看:显示模型的状态。只有一个控制器(可以在不同的视图之间共享?)。 1-1与模型的关系,1-1与控制器的关系
  • 控制器:处理视图上的用户操作并更新模型。一个控制器可以在不同的视图之间共享,控制器只与一个模型交互?

我不确定最后两个:

  • 一个视图可以有多个控制器吗?或者视图可以与另一个视图共享控制器?或者只是1:1的关系?
  • 控制器可以处理多个视图吗?它可以与几个模型互动吗?

另外,我利用这个问题来询问另一个与MVC相关的问题。我已经抑制了MVC的不同成员之间的所有同步调用,使用了事件和委托。最后一个呼叫仍然是同步的,实际上是最重要的呼叫:视图和控制器之间的呼叫仍然是同步的,因为我需要知道控制器是否能够处理用户的动作。这非常糟糕,因为这意味着我可以在控制器处理或做一些工作时阻止UI线程(因此客户端本身)。我怎么能避免这个?我可以使用回调但是我怎么知道回调来自哪个事件?

PS:我现在无法改变模式,所以请避免使用“使用MVP或MVVC等”的答案;

谢谢!

2 个答案:

答案 0 :(得分:0)

你可能过度思考并过度形式化了。

以下是我的看法:

  1. 模型:这是实际工作的实际内容。
  2. 控制器:这是将输入发送到模型中的东西,因此它可以正常工作。
  3. 查看:显示结果。
  4. 就是这样。最简单的类比是控制台应用程序 - 应用程序是模型,STDIN是控制器,STDOUT是视图。

    扩展这种类比,许多GUI应用程序都是通过附加到STDIN / STDOUT构建在命令行应用程序之上的。在这种情况下,向STDIN发送数据的东西是控制器,从STDOUT获取数据并放在窗口上的东西是View,控制台应用程序仍然模型。

    再次是CS 101 - 输入,处理,输出。它对于GUI应用程序来说只是比较棘手,因为输入和输出通常位于同一个窗口上。

    您(显然)不需要实际拥有控制台应用程序来执行此操作 - 即使在单个进程中也可以进行分色。发生的所有其他奇怪的布线都是使部件之间的这种关系工作所需的一切。但是布线并不重要 - 重要的是责任分离和代码的逻辑组织。

    因此,1个视图是否必须映射到1个控制器,或者任何其他正交性问题是次要的。事实上,你应该只是做你的问题领域所需的任何事情,但我(通常)反对过度热衷的代码泛化 - IOW,不要把事情放在一起而不是真的一样。

答案 1 :(得分:0)

模型,视图和控制器是概念层,而不是单个对象,所以老实说,从多重性方面考虑它们并没有多大意义。不过,我可以尝试为你找一个答案。

  • Controller为单个操作返回单个结果;结果可能是实际视图,或者可能是其他内容。但是,Controller实际上并没有与视图进行任何交互;它所做的只是在其结果中提供一条或两条信息:应该使用的视图的名称和(可选)用于填充的模型。由视图引擎实际创建和绑定视图,这与普通的智能客户端UI逻辑有很大的不同。

  • 控制器可以与模型的几个不同部分进行交互,或者在某些情况下根本不与之交互;关系的那一方没有规则。在操作结果中,Controller必须返回0或1个“模型”实例,但这可能不是真正的域模型,它可能是视图模型。

  • 视图通常只与一个模型(或视图模型)绑定,但在某些情况下,视图可能只是内容,因此不会绑定到任何内容。

所以,用非常粗糙的UMLesque说法:

  • 控制器:型号= 0 .. *:0 .. *
  • 控制器:视图= 0 .. *:0..1(请求)或0 .. *:0 .. *(整体)
  • 查看:Model = 0 .. *:0..1

这是ASP.NET MVC特有的。如果您正在设计自己的MVC实现,那么显然您可以选择以您喜欢的方式实现它。祝你在WinForms中实现MVC好运;表单根本不像Views,甚至像MVP / MVVM这样的模式也非常困难(尽管并非不可能,例如微软的CAB / SCSF),直到你转向WPF。

相关问题