MVC组件化与并行数据检索

时间:2011-10-11 18:18:24

标签: asp.net-mvc asp.net-mvc-3 razor

这个问题描述了解决与ASP.NET MVC相关的复杂架构问题的两种方法。不幸的是,我们的团队对这项技术还很陌生,我们还没有找到关于这个特定主题的任何可靠的信息来源(除了概述,据说MVC更多的是关于分离而不是组件化)。所以我们现在犹豫不决:我们的解决方案是否合适,或者有一种不同的明显方法来解决这个问题。

我们需要在构建基于ASP.NET MVC的设计时考虑到组件化。查看引擎Razor也是我们的要求。这里的关键特征是预期任何级别的控制器嵌套(显然是Html.Action内的.cshtml指令。任何控制器都可能通过webservice调用获取数据(最终设计可以打破此限制,如下所述)。

问题是必须以异步和最大并行方式获取数据。例如。如果控制器内的两个后端调用是独立的,则它们必须并行执行。

乍一看async MVC controllers的用法可以解决所有问题。但是有一个隐藏的警告:必须在cshtml内(在视图中)指定嵌套控制器。在原始控制器完成自己的异步执行后,正在解析.cshtml视图。因此,嵌套控制器中的所有异步操作都将在单独的异步槽中执行,因此不与第一个父控制器并行执行。这是.cshtml处理的同步性限制。

经过深入调查后,我们发现有两种选择。

1)只有一个父异步控制器,它将检索所有数据并将这些数据放入容器(字典或其他)。嵌套控制器不允许执行任何后端调用。取而代之的是,他们将使用所有后端调用的结果来引用初始化容器。通过这种方式,框架的使用者必须区分父控制器和子控制器,这不是一个出色的解决方案。

2)从特殊异步HttpModule中的后端检索所有数据。该模块将初始化将驻留的相同容器,例如在HttpContext中。显然,在这种情况下,所有控制器都不允许执行任何后端调用,但它们将具有统一的内部结构(与#1选项相比)。

就目前而言,我们认为选项#2更受欢迎,但我们更感兴趣的是社区采用的可靠方式在真正的企业级MVC项目中解决此问题。

欢迎任何链接/评论。

[UPD]任何级别的控制器嵌套的要求来自我们的客户,他们想要一个系统,其中将呈现完全可重用的MVC组件。它们可以按任何顺序与任何级别的嵌套组合 - 因为在现有的基于Web表格的实现中已经完成。这是现有应用程序的业务规则,无论如何组件都可以组合在一起,因此我们无法破坏此规则。至于现在我们认为这样的组件是“控制器+视图+元数据”的组合,其中“元数据”部分描述了在场景1或2中执行的后端调用。

2 个答案:

答案 0 :(得分:0)

你为什么要在这里考虑异步电话?请记住,如果您的异步调用是这样,asp.net线程没有全部用完,因为数据库需要一段时间才能返回,一旦新请求进入,它们也将转到数据库,从而增加工作量而反过来一无所获。

说实话,我很难完全按照你的想法来完成这里。嵌套控制器......?

“这里的关键特征是任何级别的控制器嵌套都是预期的”  我想我(我们?)在这里需要更多信息。

然而,异步警告仍然存在:)

答案 1 :(得分:0)

  

E.g。如果控制器内有两个后端呼叫   他们必须独立完成。

如果它们真正独立,您可以使用来自客户端的异步JavaScript调用,并以这种方式实现某种程度的并行性。