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
。我将它们称为Controllers
Model'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 的控制器问题的主要内容,如果未能解决你的问题,请参考以下文章