使用.Net Framework 4.0和C#
我希望缓存xml文件的内容(它有键/值对)。此XML文件作为资源文件是项目的一部分(已将构建操作属性设置为“内容”和“复制到输出目录”,如果更新则为“复制”)。此外,我正在创建缓存策略,以重新加载文件如果文件已经更改,请使用HostFileChangeMonitor
。想法是,可以在不删除程序的情况下更新此xml文件。如果xml文件发生更改,则需要清除缓存并从xml文件中重新缓存键值对。
以下是代码段
//code to get the resource file full name with path...
public static string GetResourceFileFullName(string fileName)
{
string path = Assembly.GetExecutingAssembly().Location;
if (!fileName.StartsWith("\\"))
fileName = "\\" + fileName;
return path + fileName;
}
//code to cache an object with File Change Monitor
public static void AddToCahce(string key, object objectToCache, string fileNameWithFullPath)
{
CacheItemPolicy policy = new CacheItemPolicy();
List<string> filePaths = new List<string>();
filePaths.Add(fileNameWithFullPath);
policy.ChangeMonitors.Add(new HostFileChangeMonitor(filePaths));
MemoryCache.Default.Add(key, objectToCache, policy);
}
//从xml文件中读取代码并将其置于缓存中,如果没有找到...
Dictionary<string, string> keyValuePair = MemoryCache.Default["keyvalues"];
if (keyValuePair == null)
{
string xmlFileFullName = GetResourceFileFullName("sample.xml");
XElement xmlDoc = XDocument.Load(xmlFileFullName).Root;
keyValuePair = xmlDoc.Descendants("Message")
.Select(x => new
{
Key = x.Attribute("key").Value,
Value = x.Attribute("value").Value
})
.ToDictionary(d => d.Key, d => d.Value);
AddToCahce("keyvalues", keyValuePair , xmlFileFullName )
}
现在问题是,我使用xml文件的物理位置来读取内容而不是使用资源属性,例如
Properties.Resources.KeyValueXML;
原因,我不想做的就是上面那个,我需要知道xml文件内容何时发生变化,以便可以删除和恢复它。这是正确的方法吗?如果是,那么在这种情况下使用资源文件是否有任何实际价值?请评论。
有没有更好的方法?
注意:如果有帮助,这是我正在实施的类库的一部分。它不是Web或WPF应用程序。