asp.net-mvc – Asp.net MVC页面构建的最佳实践是什么,允许并行性和效率?

前端之家收集整理的这篇文章主要介绍了asp.net-mvc – Asp.net MVC页面构建的最佳实践是什么,允许并行性和效率?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在ASP.net MVC的页面构成框架的批评中,我发现很难与任何东西争论.

http://www.matlus.com/problems-with-asp-net-mvc-framework-design/

特别是这些要点:

>无法访问视图或部分视图实例
> ViewData是您的松散类型信息载体
>控制器实际上无法控制
> Child Actions对请求上下文没有任何意义
>视图与控制器耦合

对于小型应用程序,我认为很多这些都不是问题,但是在大型应用程序中,您希望重用大量共享组件,或者即使您只是拥有一个依赖于多个应用程序的大型应用程序后端信息源获取渲染视图所需的所有信息,它开始崩溃.

已经提出了针对这些问题的各种半解决方案,但是它们看起来不能很好地扩展或具有不期望的设计约束.

以下是一个示例应用程序场景:

> 50%的页面内容在应用程序中的所有页面(页眉,页脚,菜单等)中很常见
>您的应用程序实际上可能包含多个区域,每个区域都有自己的控制器等,以便进行独立开发.
>公共页面内容中的许多页面元素(菜单,页眉信息,披露)需要一个或多个服务调用来填充数据以进行渲染.

好的,所以在asp.net mvc3中,假设您决定要共享包含50%常见UI标记的常见Razor布局.这有助于分离关注,因为应用程序开发人员不需要关注常见的ui,并且可以专注于特定于其专业领域的逻辑和视图.

但是,在这种共享布局需要数据(一些或多个模型类型的某些外观)来完全呈现自身的情况下,这完全崩溃了.您可能在页面上有独立元素,每个元素都需要特定的数据模型,例如:
*主菜单模型
*二级菜单模型
*页脚链接模型
*授权模型
*页脚免责声明模型

这些模型中的每一个都可能有不同的来源.因此,尽管您可以共享模板,但是没有一种简单的方法可以共享逻辑来构建每个模型 – 并且肯定没有一个我已经看到的通用,可扩展和高性能的模板.

我见过的一些解决这个问题的方法是:

>强烈键入公共布局,这需要所有视图模型子类化公共基础模型类. (但是没有通用的解决方案来填充这样的元模型,这在设计上是有限的,并且使模型变得庞大且难以测试)此外,模型群体仍然落在每个控制器上,违反了关注点和单一责任原则,通过堆积大量额外逻辑来复杂单元测试控制器,以填充元模型以及特定于视图的模型信息.
>保持公共布局无类型,因此您不必从公共基础模型继承,但这需要您使用ViewData或ViewBag来传达模板所需的所有不同模型,这样您就会失去强大的输入优势并最终数据合同松散.您仍然存在缺乏填充元模型的一般解决方案的问题以及所有这些问题.
>每个控制器都必须子类化公共基本控制器类以支持公共布局和模型.构建元模型的共同方面的逻辑就在这里.但这并不总是理想的架构或设计约束.这至少解决了关注问题.
>在您的公共布局中,通过RenderAction()使用子动作而不是元模型,以制作可重用的“portlet”样式小部件,每个小部件都独立知道如何构建其数据模型并将其提供给视图.这对于Separation of Concerns来说真的很好,但是有一些缺点:在通过子操作渲染过程中有效地进行服务调用的视图,子操作完全不知道原始请求上下文,违反了DRY原则,因为每个子操作都没有意识到之前已经发生了什么,所以每个人都可以在同一个http请求中反复拨打相同的服务,以及其他人.想象一下,所有需要独立调用RenderAction()的页面的20-30个元素……

还有其他情况(一些在stackoverflow上也可以看到),其中RenderAction()作为解决方案存在其他问题.例如在循环中发出多个RenderAction()调用的事实导致所有这些控制器方法的串行执行.没有机会与RenderAction()并行.每个子控制器操作中的I / O绑定服务调用会导致整个呈现过程在I / O上等待.控制器只知道其直接视图和模型,并且没有任何内容可以全面了解视图内部的内容,以便并行化某些操作.

上述评论的作者在ASP.Net mvc之上开发了一个名为Quartz的不同UI模型,它允许上帝控制器对视图有深入了解,并且可以将每个视图模型交给视图模型,因此有机会并行化服务调用.构建这些视图模型的中心位置.我不知道这是否是提供克服问题的最佳设计,但看起来很有希望.

我的问题是,在ASP.Net MVC之上构建复杂应用程序的最佳实践是什么,它可以干净地解决这些问题?我已经想到了几种可能性(尽管在ASP.Net MVC中没有一种可能是实用的 – 那就是TBD),但是其他人必须已经遇到过这种情况. ASP.Net MVC中的设计模式是什么,或者是什么样的派克可以使这成为一个容易处理的问题?

解决方法

就个人而言,我认为通过RenderAction使用Child Actions的优势大于缺点.

您可以创建“窗口小部件”类型的元素,并将它们的逻辑包装在控制器操作中 – 这样调用窗口小部件的视图可能仍然完全不知道子操作正在做什么以及它是如何做的 – 导致一个很好的分离关注的问题.

您已经详细说明了这种方法的缺点,但我认为可以通过合理的缓存策略将负面影响降至最低.

猜你在找的asp.Net相关文章