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

时间:2010-09-02 04:55:57

标签: design-patterns frameworks caching business-objects

我已经厌倦了现有的应用程序 - 这些尝试本身会做很多事情而且大部分都是糟糕的!

此应用程序是具有典型UI的ASP.net 3.5 Web应用程序 - >业务 - > DAL的模式。

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

目前,没有单点实例化这些对象,如工厂实现或这些行上的某些内容。对象实例化遍布整个地方。

我一直在考虑的一个选项是将整个实例逻辑封装在工厂中 - 并在工厂中构建逻辑以缓存对象并相应地返回。

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

然而,上述两个选项都具有很强的侵入性,并且会涉及一个主要的,如果不是完全的改造影响整个业务层,这是我的一个主要问题,因为没有(阅读zilch,nada,零,大 - O)代码的任何部分的自动化单元测试。

我想知道的是:

  1. 有没有人知道任何框架/产品能够让我在不重新设计/重写整个业务层的情况下实现这一目标?

  2. 如果缺少1,是否有更容易实施人们可能与上述两个选项相比的建议?

  3. 不,退出公司不是一个选择 - 不管怎么说! : - )

2 个答案:

答案 0 :(得分:3)

通过分析和memoize他们的来电找到最严重的罪犯。

对评论的回应

Memoization对于使用模式无动于衷,它实际上只是用核心中较便宜的查找替换昂贵的操作(命中数据库)。使用模式肯定会影响系统中memoization的有效性,但不会告知如何编写memoization代码。

这是一个便宜的例子:

define square_root(n):
   if cache[n] does not exist then
      cache[n] = compute_root(n)

   return cache[n]

这意味着第一次调用square_root(1729)时,计算根目录需要一些时间。 square_root(1729)的所有后续调用只需要缓存查找。如果再也不进行该调用,则会浪费缓存时间和空间。

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

答案 1 :(得分:0)

缓存被嵌入到ASP.Net和.Net 4.0中(我知道你还没有切换),可以在ASP.Net类的内部或外部使用相同的缓存。

您仍然需要控制对象实例化。我建议一个依赖注入框架。我喜欢autofac,这将允许你从一个依赖注入的提供者请求新对象,并决定你将如何处理这个提供者中的缓存。

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