【问题标题】:GRASP's Controllers and MVC's Controllers questionGRASP 的控制器和 MVC 的控制器问题
【发布时间】: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

我说的对吗?

【问题讨论】:

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


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

    是的,你是对的 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-09
      • 1970-01-01
      • 2013-07-29
      • 2010-12-30
      • 2014-06-01
      • 1970-01-01
      • 2014-02-23
      • 1970-01-01
      相关资源
      最近更新 更多