我正在努力尊重MVC模式的最佳状态。它大大简化了开发人员(或开发人员)的生活。我想知道的是如何一次加载多个部分。
为了说清楚,我将以一个待办事项列表为例(现在已经很常用了)。假设有项目 - >里程碑 - >任务。
我们需要什么:
对于最后三个,我们可以使用单独的控制器为我们提供相应的数据。当我们尝试在嵌套的json编码数组中“全部获取”时,问题就出现了。
最好的办法是什么?
我想到了几个可能性:
- 将项目,里程碑和任务生成器移动到帮助程序类中 - 这意味着我们从各个控制器调用它们,并在需要将它们全部打开时调用它们
- 从项目的角度来看,调用里程碑(每个项目)的控制器/视图[反过来调用控制器/任务视图(每个里程碑)]。这可能看起来像1中的3个请求的模拟。
动机来自这样一个事实,即虽然我可以获取所有项目,然后是每个项目的里程碑,然后是每个里程碑的任务,但这需要很多请求。如果我们可以将所有调用集合在一起,那么获取数据所需的时间会少得多,更不用说在一个请求中数据更有条理。
答案 0 :(得分:1)
您肯定需要将数据访问问题分离为可以从不同控制器访问的逻辑层。
如果您愿意沿着DDD路径前进,那么识别域对象(项目,任务等)是有意义的,聚合根然后构建数据库访问存储库。您可以在不同的控制器中重用存储库(例如ProjectRepository,TaskRepository),存储库本身将是重用的单元,允许您使用相同的接口从多个控制器获取数据。如果需要从同一控制器中有效地从多个存储库获取数据,您还可以利用工作单元。
如果你没有沿着DDD路径走下去,你可以使用ActiveRecord模式(比如在Ruby on Rails中),它将是数据库记录的内存中表示。如果您使用关系SQL数据库,这可能非常简单。
我认为您的案例中的项目是聚合根,这意味着您只有一个存储库(ProjectRepository)。该存储库将有一个操作来获取所有项目并获取所有相关数据(里程碑等),这将是一个尽可能接近数据源(存储过程?)优化的快速操作。在控制器本身上,您将使用检索到的对象并序列化/编码为JSON。
答案 1 :(得分:0)
从浏览器发出3个独立的JSON请求。别担心。 如果您打开Firebug,并打开mail.google.com - 您将看到超过40个请求。