在Silverlight中缓存静态类的数据

7
我有一个静态类,保存了一些信息。
public static class SampleDataCache
{
    private static Dictionary<string,SampleData> cacheDict = new Dictionary<string,object>()

    public static Get(string key)
    {
        if(!cacheDict.Contains[key])
            cacheDict.Add(key,new SampleData());

        return cacheDict[key];
    }
}

当我刷新页面时,我希望SampleDataCache保留其数据。是否有简单的方法可以实现这一点?
2个回答

4
由于缓存以其当前形式存储在内存中,因此当页面刷新时,数据自然地被遗忘 - 那是应用程序的新实例。但是,您可能有兴趣利用隔离存储来保留每个用户的数据。
使用隔离存储,您基本上拥有一个包含文件系统,可以将数据存储在其中,然后进一步检索它。朝着正确方向迈出的一步可能是创建一个要表示“缓存”数据的类,使其可序列化,然后使用静态类作为缓存控制器,您可以从隔离存储中读取和写入这些对象。 Silverlight 中的隔离存储入门

那么……Application类的ApplicationLifetimeObjects属性怎么样?为什么要去隔离存储呢? - bleepzter

3

你应该记住额外的if语句(如果没有人理解的话;/)。并且你可以更加通用和类型安全。请看下面的例子,这是一个良好编写的缓存模式,也可以作为一个方面来使用。

using System;
using System.Collections.Generic;

namespace SampleDataCache {

  public class SampleData {
    public string Name { get; set; }
  }

  public static class DataCache {
    private static readonly Dictionary<string, object> CacheDict
      = new Dictionary<string, object>();

    private static readonly object Locker = new object();

    public static T Get<T>(string key, Func<T> getSampleData) {
      if (!CacheDict.ContainsKey(key)) {
        lock (Locker)
          if (!CacheDict.ContainsKey(key)) {
            CacheDict.Add(key, getSampleData());
          }
      }
      return (T)CacheDict[key];
    }
  }

  public class Program {
    private static SampleData CreateSampleData() {
      return new SampleData() { Name = "Piotr Sowa" };
    }

    private static void Main(string[] args)
    {
      SampleData data = DataCache.Get("Author", CreateSampleData);
    }
  }
}

问候


是的...这在WinForms和WPF中有效。但在Silverlight中不行。是的,虽然它很好地解释了一个通用的实现(尽管过度设计了),但它实际上并未解决问题。记住,仅仅因为它是静态的并不意味着它能解决问题,特别是在Silverlight和/或ASP.NET应用程序中。 - bleepzter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接