2009-11-09 95 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對象的對象)。