通用单例并在页面之间共享数据

时间:2014-03-19 13:01:34

标签: windows-phone-8 singleton

要在我的Windows Phone 8应用程序中的页面之间共享数据(复杂数据)我想实现单例,但我希望它是通用的,是否可能?我想它为每种类型创建一个新实例不是吗?

 public sealed class NavigationContextService<T>
{
    private static readonly NavigationContextService<T> instance = new NavigationContextService<T>();
    private NavigationContextService()
    {
    }
     public static NavigationContextService<T> Instance
    {
        get
        {
            return instance;
        }
    }

    public List<T> ShareList { get; set; }
    public T ShareData { get; set; }
}

1 个答案:

答案 0 :(得分:0)

它正在为每种类型创建一个新实例,因为它是通用的 - 你希望它是这样的(如果你从泛型开始,看看一些教程,博客或MSDN - 你会很容易在互联网上找到很多。)

它仍然是一个单身人士。当你使用

NavigationContextService<string>.Instance.ShareList.Add("Text");

然后您有一个类型为string的实例。当您想要创建类型不同的相同方法/类时,泛型可以提供很多帮助。

另一方面,如果你想创建包含不同类型的Singleton,那么你可以将你的类修改为非Generic,如下所示:

public sealed class NavigationContextServiceNonGeneric
{
    private static readonly NavigationContextServiceNonGeneric instance = new NavigationContextServiceNonGeneric();
    private NavigationContextServiceNonGeneric() { ShareList = new List<object>(); }

    public static NavigationContextServiceNonGeneric Instance
    { get { return instance; } }

    public List<object> ShareList { get; set; }
    public object ShareData { get; set; }
}

正如您在上面的代码中所看到的,我没有定义共享数据的“确切”类型 - 它是object类型。然后,您可以轻松地保存大部分数据:

NavigationContextServiceNonGeneric.Instance.ShareList.Add("Text");
NavigationContextServiceNonGeneric.Instance.ShareList.Add(3);
NavigationContextServiceNonGeneric.Instance.ShareList.Add(3.0f);

它是单例,可以容纳不同类型的共享数据。 它也有缺点 - 主要是你必须记住你持有的数据类型和顺序。在我看来,由于这个事实,通用版本更好。

一切都取决于您的代码的目的。这两种方法可能会有更简单,更好的方法。


对于页面导航,您可以尝试使用this article中的方法 - 扩展导航服务以传递对象:

public static class Extensions
{
  private static object Data;

  public static void Navigate(this NavigationService navigationService, Uri source, object data)
  {
     Data = data;
     navigationService.Navigate(source);
  }

  public static object GetNavigationData(this NavigationService service) { return Data; }
}

然后你使用它:

NavigationService.Navigate(yourUri, DataToPass);

导航后,您可以获取数据:

string myTextData = NavigationService.GetNavigationData() as string;

此方法有以下缺点:它不是类型安全的,并且您的数据不会在逻辑删除模式下保留。

至于第二个缺点,您可以轻松地使用PhoneApplicationService.State Property进行页面导航 - 它是一个字典(在逻辑删除时保留):

PhoneApplicationService.Current.State.Add("data", yourData);

然后当您想要获取数据时:

yourDataType yourData = PhoneApplicationService.Current.State["data"] as yourDataType;

您还可以通过更多方式传递数据。