GRASP的控制器和MVC的控制器问题

时间:2010-07-23 07:07:15

标签: c# java model-view-controller oop controller

问题简介

我已经通过Craig Larman的Applying UML and Patterns: An Introduction to Object-Oriented Analysis and Design and Iterative Development了解了OO分析和设计,它遵循UP(统一过程)。

使用它时,我们通常会绘制一个Domain Model,然后从中进行交互/关联图,我们到达Class Diagrams。然后我们通常将Controllers作为我们Model和“外部世界”之间的“门”(遵循GRASP模式)。进行任何类型逻辑的所有世界访问都必须通过Controllers。我会打电话给那些Controllers Model's Controllers,所以稍后当我们谈论MVC's Controllers时,我们可以区分它们。 这可以在下面最令人敬畏的图表中描述:

alt text http://dl.dropbox.com/u/6187267/pic1.jpg

在黑色中,我们有Model个对象和类的关联。红色表示Model Controllers,使用Model中的数据。

基本上,遵循这种设计,您只能通过所谓的Model处理Model's Controllers(我们通常每Controller有一个Use Case!)。

现在问题本身

在了解MVC时,我总是有MVC's Controller实际上是Model's Controller的问题?他们是相同的概念吗?我认为它们是不同的概念,因为我们过去所做的Model Controllers除了我们Model上的类之外什么都不知道,这不是MVC's Controllers中似乎发生的事情。

如果我说的是真的,下面的图表应该是有道理的:

alt text http://dl.dropbox.com/u/6187267/mvc_.png

我是对的吗?

1 个答案:

答案 0 :(得分:4)

我想我明白你在说什么:)

您呼叫的内容Model Controllers称为存储库。这是一个界面,用于定义与底层模型的特定交互。例如,如果您有一个代表Employees的类,并且您想要做三件事:

  • List<Employee> List()
  • Add(int employeeID)
  • Delete(int employeeID)

然后你将定义一个名为:

的接口
public interface IEmployeeRepository
{
    List<Employee> List();
    void Add(int employeeID);
    void Delete(int employeeID);
}

您将确保所有代码都处理接口,而不是直接处理对象 - 存储库模式。这就是你所说的Model Controller。有关详细信息,请参阅http://www.dev102.com/2008/12/08/working-with-aspnet-mvc-part-2-the-model-and-the-repository-pattern/,或搜索存储库模式。

MVC世界中的控制器实际上是指示程序流逻辑的东西。例如,假设您查看了员工列表。当用户点击此视图上的“删除”按钮时,控制器将加载相应的存储库并在其上调用Delete方法。

tl; dr:MVC Controller =当用户这样做时,在程序中执行此操作(程序逻辑);存储库(模型控制器)=定义模型中对象支持的交互

是的,你是对的:)。