MVC模式:使用最佳实践

时间:2012-09-30 09:37:53

标签: model-view-controller

我正在努力尊重MVC模式的最佳状态。它大大简化了开发人员(或开发人员)的生活。我想知道的是如何一次加载多个部分。

为了说清楚,我将以一个待办事项列表为例(现在已经很常用了)。假设有项目 - >里程碑 - >任务。

我们需要什么:

  • 全部获取 - 包含所有里程碑的所有项目,其中包含嵌套json编码数组中的所有任务。
  • 只获取项目
  • 只获得里程碑
  • 只获取任务

对于最后三个,我们可以使用单独的控制器为我们提供相应的数据。当我们尝试在嵌套的json编码数组中“全部获取”时,问题就出现了。

最好的办法是什么?

我想到了几个可能性:
  - 将项目,里程碑和任务生成器移动到帮助程序类中 - 这意味着我们从各个控制器调用它们,并在需要将它们全部打开时调用它们   - 从项目的角度来看,调用里程碑(每个项目)的控制器/视图[反过来调用控制器/任务视图(每个里程碑)]。这可能看起来像1中的3个请求的模拟。

动机来自这样一个事实,即虽然我可以获取所有项目,然后是每个项目的里程碑,然后是每个里程碑的任务,但这需要很多请求。如果我们可以将所有调用集合在一起,那么获取数据所需的时间会少得多,更不用说在一个请求中数据更有条理。

2 个答案:

答案 0 :(得分:1)

您肯定需要将数据访问问题分离为可以从不同控制器访问的逻辑层。

如果您愿意沿着DDD路径前进,那么识别域对象(项目,任务等)是有意义的,聚合根然后构建数据库访问存储库。您可以在不同的控制器中重用存储库(例如ProjectRepository,TaskRepository),存储库本身将是重用的单元,允许您使用相同的接口从多个控制器获取数据。如果需要从同一控制器中有效地从多个存储库获取数据,您还可以利用工作单元。

如果你没有沿着DDD路径走下去,你可以使用ActiveRecord模式(比如在Ruby on Rails中),它将是数据库记录的内存中表示。如果您使用关系SQL数据库,这可能非常简单。

我认为您的案例中的项目是聚合根,这意味着您只有一个存储库(ProjectRepository)。该存储库将有一个操作来获取所有项目并获取所有相关数据(里程碑等),这将是一个尽可能接近数据源(存储过程?)优化的快速操作。在控制器本身上,您将使用检索到的对象并序列化/编码为JSON。

答案 1 :(得分:0)

从浏览器发出3个独立的JSON请求。别担心。 如果您打开Firebug,并打开mail.google.com - 您将看到超过40个请求。