2012-06-10 59 views
2

我建立了一個配置系統,可以從MySQL數據庫中獲取配置。我已經有了它,但現在我意識到要從緩存中獲得Value,我必須使用這個冗長的代碼。簡化班級結構

CacheLayer.Instance.Caches["app_config"].Current.EmailALertInterval 

我想刪除Current,但我還沒有設法找出是否有可能有類直接做到這一點。目前的實現看起來像這樣。

public T Current 
{ 
    get 
    { 
     if (_current == null) 
     { 
      ReloadConfiguration(); 
     } 

     return _current; 
    } 
} 

但我想簡單地將其這樣:

CacheLayer.Instance.Caches["app_config"].EmailALertInterval 

我在看這樣的事情,但用在索引這隻作品。

public T this[T key] 

編輯:只是添加一些更多的上下文我會添加一些更多的代碼。

這是CacheLayer。它基本上允許我存儲多個配置。我可能有一個例如一般的應用程序配置,但我也可以抓住一個使用的電子郵件數組。

public Dictionary<String,IGenericCache<dynamic>> Caches 
{ 
    get 
    { 
     return _caches; 
    } 
} 

public void AddCache(String config) 
{ 
    _caches.Add(config,new GenericCache<dynamic>(config)); 
} 

在我的GenericCache裏面我使用存儲在MySQL數據庫中的JSON字符串加載配置。

_current = JsonConvert.DeserializeObject<T>(db.dbFetchConfig(config)); 

之所以GenericConfigT而不是dynamic是因爲我希望能夠做一些針對性的implmentation的CacheLayer之外,一個不一定使用dynamic

另一個關於我如何使用它的例子。

List<String> EmailList = CacheLayer.Instance.Caches["EmailList"].Current; 

這實際上會從包含電子郵件列表的MySQL中獲取一個JSON數組。

任何想法?

回答

2

添加一個新的屬性

public int EmailALertInterval 
{ 
    get { return Current.EmailALertInterval; } 
} 
+0

感謝。不幸的是,我在原帖中忘記提到我在大多數情況下使用'dynamic'。因此'EmailAlertInterval'實際上是在運行時生成的,而不是編譯時生成的。 – David

1

你有很多的配置和EmailAlertInterval只是一個例子,對不對?

然後你必須改變Caches類,就像你已經提到的那樣。但是,因爲您已經知道哪些緩存將進入CacheLayer(就我所瞭解的例子而言),您可以在其中擁有屬性,例如,

CacheLayer.Instance.Caches.AppConfig.EmailALertInterval 

而且該屬性處理Current現在的操作。

public T AppConfig 
{ 
    get 
    { 
     if (appConfig == null) 
     { 
      return ReloadConfiguration(); 
     } 

     return appConfig; 
    } 
} 

認爲應該更優雅

+0

我喜歡這個主意,但是我認爲這不會奏效。我更新了一些關於如何設計CacheLayer以及GenericCache類的示例代碼。 – David

+0

如果你喜歡這個主意,讓它工作;)你已經知道那裏>應該是一個app_config部分,所以我沒有看到一個問題得到這個工作。也許這將幫助你:http://stackoverflow.com/questions/947241/how-do-i-create-dynamic-properties-in-c,當然那一個http://www.codeproject.com/Articles/ 21107/Dynamic-Properties-Implementation-Using-C-Generics –

+0

太棒了。去挖掘這兩個。我認爲這可能是我正在尋找的。是的,應該總是有一個app_config,但也可能有其他配置,如電子郵件列表,各種組件等。我加載插件等,他們的想法是,他們應該都有他們的sepeare配置。 – David