如何缓存实例化对象?

时间:2009-11-09 17:17:01

标签: c# caching object

我以前每次需要员工信息时都会遇到数据库。然后我自学了数据缓存,并从此大大解决了这个问题。

现在,我想把它提升到一个新的水平。我想通过缓存对象实例来减少加载时间。我不确定我是否清楚,所以我会再解释一下。我有一个员工对象(例如清酒)有50个属性。其中一些属性是其他相关对象的通用列表(例如属于该员工的网络资产列表)。因此,当我为员工#30455实例化员工对象时,我不必点击数据库(必要),因为缓存了这么多。

但是,我必须运行属性列表,用来自缓存数据集的数据行中的数据填充它们。我还必须填充我选择包含在头端的通用列表。似乎我应该能够缓存该对象,所以我不必再做所有这些。想法?

3 个答案:

答案 0 :(得分:3)

听起来你正试图重新实施NHibernate。这是一项艰巨的任务。 NHibernate通过一级和二级缓存来缓存您在这里谈论的内容。我不确定它是如何在那里实现的,但它们正在使用过期的Session个对象,通常是在Web请求结束时。通过将对象存储在内存中,可以在给定的Session内缓存所有内容。

您的数据层是否包含某种类型的基于会话的对象?如果没有,你可以通过一个公共静态字典做一些非常粗略的缓存,你在NHibernate会话的整个生命周期中都会这样做。

答案 1 :(得分:0)

我曾经想到的是使用方法而不是构造函数来实例化员工对象。然后,我可以做点像......

public static Employee getEmployee(int EmployeeId)
    {
        HttpContext context = HttpContext.Current;
        string key = e.ToString() + "_" + EmployeeId;

        Employee e = (Employee)context.Session[key];
        if (e == null)
        {
            e = new Employee(EmployeeId);
            context.Session[key] = e;
        }
        return e;
    }

......所以我可以......

Employee e = Employee.getEmployee(35440);

我已经在某些地方做过这个,但我从来没有觉得这是最好的方式......似乎更总是使用构造函数实例化。还有更好的方法吗?

答案 2 :(得分:0)

这是我用于我想要实现的目标的模式:

public class Foo
{
   private static Dictionary<int, Foo> FooCache = new Dictionary<int, Foo>();

   private Foo(int id) 
   {
      // logic for creating/looking up/whatever Foo objects from their ID
      // goes here 
   }

   public static Foo CreateFoo(int id)
   {
      if (!FooCache.ContainsKey(id))
      {
         FooCache.Add(id, new Foo(id));
      }
      return FooCache[id];
   }
}

您当然可以实现Foo构造函数和CreateFoo方法,以便在id之外采用其他参数(例如,您用于填充的DataRow对象Foo对象与。)