由于MVC3应用程序中面向对象的方法,防止重复的DB调用

Jos*_*osh 5 c# design-patterns asp.net-mvc-3

我们有一个MVC3应用程序,我们创建了许多小动作和视图来处理将数据放在我们需要的任何地方.例如,如果它是一个博客,我们想要显示评论,我们有一个评论操作和视图,我们可以将它放在我们想要的任何地方,用户个人资料视图和博客文章视图等.

由于我们在应用程序中拥有的所有其他小视图,所导致的问题是每个小视图或操作需要每次页面加载多次调用同一服务.因此,在包含这些小视图的非常大的页面上,我们可能有80多个sql调用,其中40%是重复的,然后页面变慢.当前的解决方案是缓存一些数据,并在ViewBag中传递一些数据,如果我们可以这样,如果你想要用户的配置文件,你检查它的缓存或ViewBag是否没有要求它.

对于一个设计模式来说,这真的很脏,并且viewbag方法看起来很糟糕,因为它必须从顶部向下传递.我们已经在HttpCurrent.Items中添加了一些数据,以便根据请求(而不是缓存,因为数据可以更改),但是必须有一些干净的解决方案,感觉不对,也是干净的?

编辑

我被要求更具体,虽然这是一个内部业务应用程序,但我无法泄露大部分具体细节.

所以把它变成软件类比.让我们将它与facebook进行比较.想象一下,这个MVC应用程序对每个facebook帖子都有一个动作,然后在该动作下它对于like按钮和注释数量有另一个动作,然后是向用户显示最高评论的另一个动作.我们的应用程序设计方式我们会在每个操作中获取当前用户配置文件(因此在上述情况下最少为4次),然后子操作将获得父墙贴文以验证您是否有权查看它.现在你可以考虑缓存每个安全检查,墙贴等的调用,但我觉得缓存是针对应用程序生命周期中需要的东西,而不仅仅是在这里和那里的小块来纠正你的错误应用程序是架构的.

rya*_*234 0

根据我对您的问题的理解,我看到您的代码可能会在两个潜在的地方得到帮助。

  1. 每页的调用次数过多。换句话说,你的工作分工太细化了。您也许可以通过创建包含更多信息的对象来组合对服务的调用。如果您有一个评论对象和一个具有有关评论的聚合数据的对象,则可以将它们合并为一个对象/一个调用。只是一个想法。

  2. 更有效地缓存。您说您已经在尝试缓存数据,但想要一种可能更好的方法来做到这一点。在我最近从事的一个项目中,我使用 AOP 框架对 WCF 调用进行缓存。它对于开发来说效果非常好,但最终在大流量生产网站中速度太慢。

对于 WCF 调用,代码将如下所示(大致):

[Caching(300)]
Comment GetComment(int commentId);
Run Code Online (Sandbox Code Playgroud)

您只需在 WCF 调用上放置一个带有时间间隔的装饰器,AOP 将处理其余的缓存事宜。当然,我们还使用了外部缓存框架 (AppFabric) 来存储 WCF 调用的结果。

面向方面的框架 (AOP): http://en.wikipedia.org/wiki/Aspect-oriented_programming 我们使用 Unity 进行 AOP: 企业库 Unity 与其他 IoC 容器

不过,我强烈考虑尝试缓存实际的服务调用,以便您可以随心所欲地调用它们。