如何:Windows Phone中的数据持久化



我正在写一个Windows Phone应用程序。我想做的是,当应用程序启动时,它会获取一些数据(设置或其他)我希望这些数据在应用程序的整个生命周期中持续存在;例如,我不想一直读取IsolatedStorage或每当我需要那块数据时调用服务器。

最好的方法是什么(加载和共享)?考虑到以下几点:

  1. 我希望它是MVVM兼容
  2. 我用的是Caliburn。微
  3. 数据为只读
  4. 应用程序有多个共享数据的page/View和ViewModels

Phil提到的静态类是个好主意,但我建议考虑使用依赖注入。您可能不需要一个完整的IoC容器,但这可能会对您的场景有所帮助。这份原稿。Micro使得集成这样一个容器非常容易。

创建Settings类。(我还将创建一个ISettings接口,以便您可以将存根设置传递到视图模型中进行测试,但这是额外的奖励。)然后让你所有的ViewModels在它们的构造函数中需要一个ISettings的实例。

当你的应用程序启动时,你创建一个Settings的实例,从IsolatedStorage或其他任何你有设置的地方读取,然后将该实例传递到任何被创建的ViewModel。

Settings类可以负责在需要时将设置保存回IsolatedStorage。

这个场景的一个例子:

AppBootstrapper类:

PhoneContainer container;
ISettings settings;
protected override void Configure()
{
    // Your usual stuff go here
    settings = new Settings();
    settings.LoadSettings();
    container.Instance(settings);
}

在你的ViewModel类中:

ISettings settings;
public MainPageViewModel(ISettings settings)
{
    this.settings = settings;
}
在这一点上,你将有所有的设置为你的ViewModel。

如果我正确理解了你的问题,你可以使用静态类中的静态成员。只要你在你想要使用成员的地方引用这个类,只要应用在运行,这些成员就会一直存在。

如果我误解了"应用程序寿命",我会用另一个解决方案更新答案

使用Caliburn micro,我喜欢创建一个SharedData类并将其注册为单例容器。然后将它注入到任何需要使用它的viewmodel中。CM中的导航服务也使得使用. withparam在页面之间传递数据变得简单。

编辑:我刚刚意识到这基本上是丹尼斯说的。我还提到,我还使用SterlingDB来在ViewModels之间持久化一些东西。

我误解了Caliburn是什么-我在想,出于某种原因,它是一个DI容器。既然它不是,那么我建议使用一个。就我个人而言,我会使用OpenNETCF IoC,因为我对它很熟悉,但任何受支持的容器都可以工作。在应用初始化时,加载你的设置和任何其他你想要的服务,并把它们放到DI容器中(或者让容器为你创建它们)。

对于IoC,在应用程序初始化中看起来像这样:

// assuming MySettings will initialize itself in the ctor
RootWorkItem.Services.AddNew<MySettings, IMySettings>();

var settings = new MySettings();
// init settings here
RootWorkItem.Services.Add<IMySettings>(settings);

然后在应用程序中任何你想要它们的地方,你通过接口类型拉(解析):

var settings = RootWorkItem.Services.Get<IMySettings>();

并使用返回的实例。您也可以在所有情况下使用具体类型而不是接口,但是我更倾向于使用接口来允许更容易的测试和模拟。

最新更新