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

Posted

技术标签:

【中文标题】GRASP 的控制器和 MVC 的控制器问题【英文标题】:GRASP's Controllers and MVC's Controllers question 【发布时间】:2011-03-19 23:06:53 【问题描述】:

问题介绍

我通过 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。我将它们称为ControllersModel's Controllers,所以稍后当我们谈论MVC's Controllers 时,我们可以区分它们。 这可以用下面最棒的图表来描述:

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

黑色是Model 的对象和类的关联。红色部分是Model Controllers,它使用来自Model 的数据。

基本上,按照这种设计,您只能通过所谓的Model's Controllers 使用Model(我们通常每个Use Case 都有一个Controller!)。

现在是问题本身

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

如果我说的是真的,下图应该是有意义的:

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

我说的对吗?

【问题讨论】:

【参考方案1】:

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

您所称的Model Controllers 称为存储库。这是一个定义您与底层模型的特定交互的接口。例如,如果您有一个代表员工的类,并且您想做三件事:

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 = 当用户执行此操作时,在程序中执行此操作(程序逻辑);存储库(模型控制器)= 定义我的模型中的对象支持哪些交互

是的,你是对的 :)

【讨论】:

以上是关于GRASP 的控制器和 MVC 的控制器问题的主要内容,如果未能解决你的问题,请参考以下文章

MVC 和 MVP 监督控制器是不是相同? [复制]

MVC 控制器和业务逻辑之间的区别(3 层)

MVC 中的 StructureMap 控制器工厂和空控制器实例

调用控制器和方法时,导航栏图像未显示在 MVC 视图上

MVC - 我需要在视图中使用控制器吗?

胖模型、瘦控制器和 MVC 设计模式