2009-11-09 90 views
0

我以前有一种情况,每次我需要员工信息时,都会打到数据库。然后我教会了自己关于数据缓存的问题,并从此大大解决了这个问题。如何缓存实例化对象?

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

,但我必须跑下来的财产清单,数据从数据行从缓存的数据集填充。我还必须填入我选择包含在头端的通用列表。似乎我应该能够缓存该对象,所以我不必再做所有这些。思考?

回答

0

一只想到我已经是使用方法,而不是构造函数来实例化Employee对象。然后,我可以这样做......

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); 

我已经在做这个的地方,但我从来不喜欢它的感觉是最好的方法...似乎更正确的总是使用构造函数实例化。有没有更好的办法?

3

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

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

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对象的对象)。