页面之间的通用辛格尔顿和共享数据(Generic Singleton and share data

2019-10-19 15:28发布

为了分享我的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; }
}

Answer 1:

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

这仍然是一个单例。 当您使用

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

那么你有一个类实例string 。 泛型帮助,当你想创建在不同类型相同的方法/班很多。

在另一方面,如果你想创建辛格尔顿,将举行不同类型的,那么你可以例如修改类是非一般是这样的:

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);

它是单,能容纳不同类型的共享数据。 它也disavantages -主要是,你要记住你持有什么类型的数据和以什么顺序。 在我看来通用的版本是因为这一事实更好。

一切都取决于你的代码的目的。 有可能会更容易,更好的方法,这些两种方法。


至于页面导航,比如,你可以尝试使用的方法从这篇文章 -您扩展导航服务传递的对象:

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属性的页面导航的目的-这是一本字典(这同时立碑保存):

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

然后,当你希望得到您的数据:

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

还有更多您可以在其中传递数据的方式。



文章来源: Generic Singleton and share data between pages