2011-05-14 78 views
0

我怎樣才能實現CacheAttribute,這樣我就可以在同一個地方擁有相同的所有屬性邏輯?如何實現緩存屬性?

我這樣做緩存

[TestClass] 
public class All 
{ 
    public string N 
    { 
     get 
     { 
      var value = 
       MemoryCache.Default.Get("Website.Tests.All.N") as string; 

      if (value != null) 
      { 
       return value; 
      } 

      value = DateTime.Now.ToString("HH:mm:ss.ffff"); 

      MemoryCache.Default.Add("Website.Tests.All.N", value, 
       new CacheItemPolicy 
       { 
        AbsoluteExpiration = 
         new DateTimeOffset(DateTime.Now.AddSeconds(5)) 
       }); 

      return value; 
     } 
    } 

    [TestMethod] 
    public void Extension() 
    { 
     var start = N; 

     Thread.Sleep(1000); 

     var end = N; 

     Assert.AreEqual(start, end); 
    } 
} 

而且我想用這個來代替

[TestClass] 
public class All 
{ 
    [Cache(Duration=5000)] 
    public string N 
    { 
     get 
     { 
      return DateTime.Now.ToString("HH:mm:ss.ffff"); 
     } 
    } 

    [TestMethod] 
    public void Extension() 
    { 
     var start = N; 

     Thread.Sleep(1000); 

     var end = N; 

     Assert.AreEqual(start, end); 
    } 
} 

有沒有辦法讓這個語法糖嗎?

+0

[Caching屬性的方法?]的可能重複(http://stackoverflow.com/questions/5328819/caching-attribute-for-method) – 2013-03-15 20:01:17

回答

0

看來你想「接管」該屬性的get方法,以便在從屬性返回「實際」值之前首先檢查緩存。由於無法在臨時性基礎上進行財產截取,因此您必須提前計劃此設施。

一種方法是使用接口並將類寫入接口。例如,

public interface IAll 
{ 
    string N { get; set; } 
} 

現在你可以使用proxies創建圍繞All原始實例也實現了這個接口的包裝。此外,由於您現在全面負責該屬性,因此只要調用getter就可以檢查緩存。由於您可以使用PropertyInfo/MethodInfo,因此每個屬性生成一個唯一的密鑰應該沒有問題。

因此,無論何時您要實例化一個All的實例,您還可以實例化此代理,並將其傳遞給All的實例。相反,該All實例的所有後續使用應該通過代理。像任何類工廠實施一樣,這要求您放棄使用新的運營商。

或者,您可以使用虛擬方法而不是接口。