Design patterns 如何缓存业务对象以避免往返数据库?

Design patterns 如何缓存业务对象以避免往返数据库?,design-patterns,frameworks,caching,business-objects,Design Patterns,Frameworks,Caching,Business Objects,我已经让自己背上了一个现有的应用程序的包袱——它试图自己做很多事情,但大部分都做得很糟糕 此应用程序是一个ASP.net 3.5 Web应用程序,具有典型的UI->Business-->DAL模式 我面临的问题是,当多个用户请求相同的信息时,即使只是为了查看信息,也会实例化相同的业务对象,从数据库中一路检索相同的数据 目前,这些对象没有像工厂实现或这些行上的某些东西那样的单一实例化点。对象实例化只是分散在各个地方 我一直在考虑的一个选择是将整个instatiation逻辑封装在工厂中,并在工厂中

我已经让自己背上了一个现有的应用程序的包袱——它试图自己做很多事情,但大部分都做得很糟糕

此应用程序是一个ASP.net 3.5 Web应用程序,具有典型的UI->Business-->DAL模式

我面临的问题是,当多个用户请求相同的信息时,即使只是为了查看信息,也会实例化相同的业务对象,从数据库中一路检索相同的数据

目前,这些对象没有像工厂实现或这些行上的某些东西那样的单一实例化点。对象实例化只是分散在各个地方

我一直在考虑的一个选择是将整个instatiation逻辑封装在工厂中,并在工厂中内置逻辑以缓存对象并相应地返回

我正在考虑的另一个选择——我过去在我的一个项目中使用过CSLA,我想我记得它用于缓存业务对象。然而,我并不知道它是如何实现这一目标的。我正在考虑使用像CSLA这样的框架,它为缓存我的业务对象提供了这样一种便利

然而,上述两个选项都是非常具有侵略性的,如果不彻底的话,将涉及一次重大的改造,影响整个业务层,这是我主要关心的问题,因为代码的任何部分都没有(阅读Zlich、nada、zero、big-O)自动化单元测试

我想知道的是:

  • 是否有人知道有哪种框架/产品为我提供了一种不需要重新设计/重写整个业务层就可以实现这一点的侵入性较小的方法

  • 在缺少1的情况下,与上面的两个选项相比,是否有更容易实现的建议


  • 不,退出公司不是一个选择——至少现在还不是

    通过分析和他们的电话找到最坏的罪犯

    对评论的回应 Memorization与使用模式无关,它实际上只是用较便宜的核心查找来替换昂贵的操作(访问数据库)。使用模式当然会影响系统内备忘录的有效性,但不会告知如何编写备忘录代码

    下面是一个简单的例子:

    define square_root(n):
       if cache[n] does not exist then
          cache[n] = compute_root(n)
    
       return cache[n]
    
    这意味着,第一次调用
    平方根(1729)
    时,将需要时间来计算根。所有后续的
    平方根(1729)
    调用将只需要缓存查找。如果再也不调用该调用,您将浪费缓存时间和空间


    因此,
    平方根的记忆只要求
    n
    有唯一的结果。优化是否有用是实际使用的一个因素。

    通过分析和调用找到最坏的违规者

    对评论的回应 Memorization与使用模式无关,它实际上只是用较便宜的核心查找来替换昂贵的操作(访问数据库)。使用模式当然会影响系统内备忘录的有效性,但不会告知如何编写备忘录代码

    下面是一个简单的例子:

    define square_root(n):
       if cache[n] does not exist then
          cache[n] = compute_root(n)
    
       return cache[n]
    
    这意味着,第一次调用
    平方根(1729)
    时,将需要时间来计算根。所有后续的
    平方根(1729)
    调用将只需要缓存查找。如果再也不调用该调用,您将浪费缓存时间和空间


    因此,
    平方根的记忆只要求
    n
    有唯一的结果。优化是否有用是实际使用的一个因素。

    缓存被烘焙到ASP.Net中,在.Net 4.0中(我知道您还没有切换),相同的缓存可以在ASP.Net类内部或外部的任何地方使用

    您仍然需要控制对象实例化。我建议使用依赖注入框架。我喜欢autofac,这将允许您仅从某个依赖注入提供程序请求新对象,并决定如何在此提供程序中处理缓存


    你来找我们时遇到了一个问题,我给了你3个问题(学习如何使用和实现依赖注入框架,学习如何使用asp.net缓存,使用缓存策略解决性能问题),但这可能是你最灵活和最可维护的赌注。

    缓存被烘焙到asp.net和.net 4.0中(我知道您还没有切换)相同的缓存可以在ASP.Net类内外的任何地方使用

    您仍然需要控制对象实例化。我建议使用依赖项注入框架。我喜欢autofac,这将允许您从依赖项注入提供程序请求新对象,并决定如何在此提供程序中处理缓存


    您遇到一个问题,我给了您3个问题(学习如何使用和实现依赖项注入框架,学习如何使用asp.net缓存,使用缓存策略解决性能问题),但这可能是您最灵活、最易维护的赌注。

    @msw-最坏的违规者是否取决于最终用户的使用模式-这是否需要我首先弄清楚应用程序的用途,还是我没有正确理解这一点?我之前没有提过,但应用程序还没有上线ts在过去的2年里一直处于开发阶段:(-如果它不是实时的,那么我希望您有一些测试数据,并且我希望它能够在某种程度上代表实时数据。如果不是,那么我们只剩下一个古老的Zen问题:“如果一个程序从未部署,它是否存在性能问题?”@msw-我确实有合理的测试数据,这些数据具有代表性,但没有多少关于用户通常如何使用屏幕的信息