2014-09-04 122 views
0

我已經在我的類庫中實現了緩存,並且遇到問題。我所做的是,我傳遞了一個值,我需要從XML文件讀取,並將返回節點和值。我已經使用字典來存儲子節點作爲鍵值對。請參閱我的XML例子緩存值被覆蓋?

<?xml version="1.0" encoding="utf-8"?> 
<Settings> 
    <Test1> 
     <CompanyDetails> 
     <Name>Test1</Name> 
     <Address1>Add1</Address1> 
     <Address2>Add2</Address2> 
     <Address3>Add3</Address3> 
     <Phone>1111</Phone> 
     </CompanyDetails> 
     <Email> 
     <Contact>[email protected]</Contact> 
     </Email> 
     <AdminUsers> 
     <User1>user1</User1> 
     <User2>user2</User2> 
     </AdminUsers> 
    </Test1> 
    </Settings> 

請參考下面

using System.Web; 
public Dictionary<string, string> GetDataFromSettings(string strValues) 
{ 
Dictionary<string, string> dictValus = new Dictionary<string, string>(); 
    XmlDocument xmlDoc = new XmlDocument(); 
    string xmlFilePath = "D:\\Test.xml"; 
    xmlDoc.Load(xmlFilePath); 
    if (!(xmlDoc == null)) 
    { 
     string[] splitValues = strValues.Split(new char[] { ',' }); 
     if (splitValues.Length > 1) 
     { 
      Dictionary<string, string> strDictValues = new Dictionary<string, string>(); 
      foreach (string strName in splitValues) 
      { 
       if (HttpRuntime.Cache[strName.Trim()] == null) 
       { 
        strDictValues.Clear(); 
        XmlNodeList xmlList = xmlDoc.SelectNodes("Settings/Test1/" + strName.Trim()); 

        foreach (XmlNode node in xmlList) 
        { 
         if (node.FirstChild.Name.ToString() != node.LastChild.Name.ToString()) 
         { 
          foreach (XmlNode childNode in node.ChildNodes) 
          { 
           strDictValues.Add(strName.Trim() + "." + childNode.LocalName, childNode.InnerText); 
          } 
         } 
         else 
         { 
          strDictValues.Add(strName.Trim() + "." + node.FirstChild.LocalName, node.InnerText); 
         } 
        } 
        HttpRuntime.Cache.Insert(strName.Trim(), strDictValues,new System.Web.Caching.CacheDependency(xmlFilePath)); 
       } 
       else 
       { 
        Dictionary<string, string> tmpDict = new Dictionary<string, string>(); 
        tmpDict = (Dictionary<string, string>)HttpRuntime.Cache[strName.Trim()]; 

        foreach (var tmpVal in tmpDict) 
        { 
         strDictValues.Add(tmpVal.Key, tmpVal.Value); 
        } 
       } 

       foreach (var tmpStrDict in strDictValues) 
       { 
        dictValus.Add(tmpStrDict.Key, tmpStrDict.Value); 
       } 
      } 
     } 
    } 
    return dictValus; 
    } 

我的代碼在我的XML上述例子中,我將傳遞字符串爲「CompanyDetails,通過電子郵件將」在功能上面,我分裂字符串,然後將每個字符串的值分別存儲在緩存中。當我第一次運行時,「CompanyDetails」下的值被存儲在名爲「CompanyDetails」的緩存中,並且當它用於節點「Email」時,緩存[「CompanyDetails」]被覆蓋,並且緩存[「Email 「]被創建並且它們都具有相同的值。這是不正確的。我無法找到它發生的原因。

謝謝
Jollyguy

+0

你爲什麼這樣做'splitValues.Length> 1'而不是'splitValues.Length> 0'?檢查'> 1'意味着您不會緩存單個密鑰的值。 – dbc 2014-09-04 14:44:54

回答

0

的問題是,當你正在構建的緩存,明確和重用字典,而不是爲每個strName鍵的新字典。由於您清除的字典是添加到緩存中的字典 - 不是複製字典,但只保存對它的引用 - 您清除以前的值。

嘗試以下操作(注意我重構稍低版本便於調試,並消除冗餘呼叫「strName.Trim()」):

public Dictionary<string, string> GetDataFromSettings(TextReader reader, string xmlFilePath, string strValues) 
    { 
     XmlDocument xmlDoc = new XmlDocument(); 
     xmlDoc.Load(reader); 
     return GetDataFromSettings(xmlDoc, xmlFilePath, strValues); 
    } 

    public Dictionary<string, string> GetDataFromSettings(XmlDocument xmlDoc, string xmlFilePath, string strValues) 
    { 
     Dictionary<string, string> dictValus = new Dictionary<string, string>(); 
     if (!(xmlDoc == null)) 
     { 
      string[] splitValues = strValues.Split(new char[] { ',' }); 
      if (splitValues.Length > 1) 
      { 
       foreach (string strName in splitValues.Select((s) => s.Trim())) 
       { 
        Dictionary<string, string> strDictValues = new Dictionary<string, string>(); 
        if (HttpRuntime.Cache[strName] == null) 
        { 
         XmlNodeList xmlList = xmlDoc.SelectNodes("Settings/Test1/" + strName); 

         foreach (XmlNode node in xmlList) 
         { 
          if (node.FirstChild.Name.ToString() != node.LastChild.Name.ToString()) 
          { 
           foreach (XmlNode childNode in node.ChildNodes) 
           { 
            strDictValues.Add(strName + "." + childNode.LocalName, childNode.InnerText); 
           } 
          } 
          else 
          { 
           strDictValues.Add(strName + "." + node.FirstChild.LocalName, node.InnerText); 
          } 
         } 
         HttpRuntime.Cache.Insert(strName, strDictValues, new System.Web.Caching.CacheDependency(xmlFilePath)); 
        } 
        else 
        { 
         var tmpDict = (Dictionary<string, string>)HttpRuntime.Cache[strName]; 
         foreach (var tmpVal in tmpDict) 
         { 
          strDictValues.Add(tmpVal.Key, tmpVal.Value); 
         } 
        } 

        foreach (var tmpStrDict in strDictValues) 
        { 
         dictValus.Add(tmpStrDict.Key, tmpStrDict.Value); 
        } 
       } 
      } 
     } 
     return dictValus; 
    } 
+0

感謝您的澄清。 – Jollyguy 2014-09-05 14:44:28