模型、视图和控制器 - 应该由谁创建什么?

14
根据良好的编程实践,程序运行时应该首先创建控制器(Controller), 模型(Model)和视图(View)组件中的哪一个,以及它们中的哪一个应该创建另外两个?
我的意思是,主函数应该先创建控制器,然后控制器应该创建模型和视图,然后以某种方式使自己被它们知晓吗?
或者我应该从创建视图开始,在显示自己之前初始化控制器,然后由控制器创建模型?
或者模型应该先创建?或者它们都应该在主函数中并行创建? 实现MVC的正确方式是什么?
编辑:虽然我目前在使用Java Swing和Windows Phone 7,但我对一般性的答案感兴趣。

问题与C#无关。标签已删除。 - Hovercraft Full Of Eels
2个回答

7
我认为控制器(Controller)和模型(Model)对象可以由主函数创建,而视图(View)应该由控制器创建(可能基于模型数据)。
当新请求到达应用程序时,应用程序主函数(工作线程?或其他)应该创建控制器。请求可能包含一些序列化的数据,这些数据可以由主线程反序列化以创建并填充新的模型对象,然后将其传递给控制器进行进一步处理。当控制器完成处理时,它可以(也可以不)创建一个视图来将处理结果传递给客户端。
此外,模型类也可以由控制器创建,以满足数据处理需求(保存数据到数据库等),或者作为返回视图的基础。
总结:
1. 控制器始终由主函数创建。 2. 模型可以由主函数或控制器创建(也许还可以由视图创建?这取决于MVC实现)。 3. 视图应该由控制器创建(可能基于模型数据)。

我同意你的观点。理论上,控制器可用于显示不同的视图,这些视图可能实现共同的接口或从共同的基类派生。在这种情况下,您还可以将所需的视图注入到控制器中。 - Olivier Jacot-Descombes
3
如果控制器负责创建视图,那么你将如何处理相同模型/控制器组合的多个视图? 控制器和视图只应就它们之间如何传递数据在接口级别上达成一致,但连接视图和控制器不必包含在它们中的任何一个中。 - Robin
@Robin 从我的角度来看,视图只是模型中数据的一种表示方式 - 它由某个带有标记的文件呈现,并且(几乎)没有逻辑。如果每个模型/控制器组合可以有多个视图,则控制器的工作就是确定当前请求最合适的视图是什么。顺便说一句,我主要使用微软的ASP.NET MVC,这就是为什么我们可能会用不同的语言交流。 - Sergey Kudriavtsev

5
我认为每个组件都可以单独创建。
  • 如果控制器负责模型的创建,这意味着没有控制器就不能有模型,并且模型和控制器之间始终存在一对一的映射关系。例如,在网站上,您可以为常规数据和xml版本的数据各自创建一个控制器(尽管通常这是相同的控制器,并且您只需指定要使用的协议)。
  • 如果控制器负责视图的创建,则会得到控制器和视图之间的一对一映射。控制器只处理传入请求,执行一些逻辑并提供答案。它不应该关心谁在请求数据。例如,在Web应用程序中,您可以拥有使用同一控制器的RSS订阅和HTML页面。另一个例子是典型的Rails应用程序,其中一个控制器映射到多个视图(索引视图、显示视图、编辑视图等)。
然而,有人需要将它们全部连接在一起,但这将是您的主要应用程序的责任,而不是这些组件中的任何一个。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接