2012-11-26 24 views
0

我每隔10秒向Web服務發送三次http請求。響應被轉交給緩存類中的三個方法(每個http查詢/請求一個),以檢查自上次以來是否更改了響應內容。比較來自不同來源的新舊內容的通用方法

我原效應初探內容轉換爲字符串,並將其與舊響應,這是存儲在緩存類的私人字符串。它的工作原理好了,但是這種方法有很多重複的代碼,你可以看到:

class Cache 
{ 
    private HubClient _hubClient; 
    private string oldIncidentAppointment; 
    private string oldIncidentGeneral; 
    private string oldIncidentUntreated; 

    public Cache(HubClient hubClient) 
    { 
     _hubClient = hubClient; 
    } 

    public bool IsIncidentAppointmentNew(string currentIncidentAppointment) 
    { 
     if (XElement.Equals(oldIncidentAppointment, currentIncidentAppointment)) 
     { 
      return false; 
     } 
     else 
     { 
      oldIncidentAppointment = currentIncidentAppointment; 
      _hubClient.SendToHub(); 
      return true; 
     } 
    } 

    public bool IsIncidentUntreatedNew(string currentIncidentUntreated) 
    { 
     if (XElement.Equals(oldIncidentUntreated, currentIncidentUntreated)) 
     { 
      return false; 
     } 
     else 
     { 
      oldIncidentUntreated = currentIncidentUntreated; 
      _hubClient.SendToHub(); 
      return true; 
     } 
    } 

    public bool IsIncidentGeneralNew(string currentIncidentGeneral) 
    { 
     if (XElement.Equals(oldIncidentGeneral, currentIncidentGeneral)) 
     { 
      return false; 
     } 
     else 
     { 
      oldIncidentGeneral = currentIncidentGeneral; 
      _hubClient.SendToHub(); 
      return true; 
     } 
    } 
} 

這又如何重構成比較了我所有的當前和未來的HTTP查詢方法新舊內容的推廣方法?

+0

字典我想 – Esailija

+0

是啊,我在想同樣的事情。但是這種方法需要我對字典中的值進行硬編碼,因此不能很好擴展。我還有什麼其他選擇? FUNC? – mupersan82

+0

字典中的硬編碼是什麼意思?該字典將任意字符串的任意數量(當然在內存限制內)映射到任意網頁內容。 – Esailija

回答

1

您可以將它們存儲在詞典:

class Cache { 

    private HubClient _hubClient; 
    private Dictionary<string, string> _pages; 


    public Cache(HubClient hubClient) 
    { 
     _hubClient = hubClient; 
     _pages = new Dictionary<string, string>(); 
    } 

    public bool isPageNew(string key, string content) { 
     string current; 
     if (_pages.TryGetValue(key, out current) && XElement.Equals(current, content)) { 
      return false; 
     } 

     _pages[key] = content; 
     _hubClient.SendToHub(); //Why have side effect here? :P 
     return true; 
    } 
} 

然後:

Cache cache = new Cache(client); 

if(cache.isPageNew("untreated", pageContent)) { 

} 
+0

感謝您的回答。 「副作用」是什麼意思? – mupersan82

+1

@ user1750323這個函數表明它給你一個yes或no的答案。但它也有副作用(做一些IO?),這對調用者來說並不明顯。 – Esailija

1

這是快速和骯髒的,所以如果它不是100%,你必須修復它;我沒有你的測試來驗證它的正確性。我也不確定你可以向字典索要一個不存在但不檢查它的密鑰,所以你可能需要處理它。

class Cache 
{ 
    private HubClient _hubClient; 
    private IDictionary<string, string> _oldIncidents; 

    public Cache(HubClient hubClient) 
    { 
     _hubClient = hubClient; 
     _oldIncidents = new Dictionary<string, string>(); 
    } 

    public bool IsIncidentAppointmentNew(string currentIncidentAppointment) 
    { 
     return DoMagicWork(
      incidentKey: "appointment", 
      currentIncident = currentIncidentAppointment 
     ); 
    } 

    public bool IsIncidentUntreatedNew(string currentIncidentUntreated) 
    { 
     return DoMagicWork(
      incidentKey: "untreated", 
      currentIncident = currentIncidentUntreated 
     ); 
    } 

    public bool IsIncidentGeneralNew(string currentIncidentGeneral) 
    { 
     return DoMagicWork(
      incidentKey: "general", 
      currentIncident = currentIncidentGeneral 
     ); 
    } 

    private bool DoMagicWork(string incidentKey, string currentIncident) 
    { 
     var oldIncident = _oldIncidents[incidentKey]; 
     if (XElement.Equals(oldIncident, currentIncident)) 
     { 
      return false; 
     } 

     _oldIncidents[incidentKey] = currentIncident; 
     _hubClient.SendToHub(); 
     return true; 
    } 
} 
+0

謝謝,似乎是一個很好的解決方案。你認爲使用Func <>或類似可以用來實現相同的事情嗎?我主要是出於好奇。 – mupersan82

+1

你可以做任何我想象的事情,但由於它的功能完全相同,所以我沒有看到太多的用處。如果我要使用一個函數,那是因爲不同的緩存項需要不同的緩存策略或一些其他自定義處理,但所有這些都是相同的。 –