Windows phone 7 如何:在Windows Phone中实现数据持久化

Windows phone 7 如何:在Windows Phone中实现数据持久化,windows-phone-7,mvvm,caliburn.micro,Windows Phone 7,Mvvm,Caliburn.micro,我正在编写一个Windows Phone应用程序。我想做的是,当应用程序启动时,它会得到一些数据(设置或其他什么),我希望这些数据在应用程序的整个生命周期中保持不变;i、 e.我不想在需要这段数据时一直读取IsolatedStorage或调用服务器 最好的方法是什么(加载和共享)?铭记以下几点: 我希望它符合MVVM 我用的是Caliburn.Micro 数据是只读的 应用程序具有多个共享数据的页面/视图和视图模型 提前感谢。如果我正确理解了您的问题,您可以使用包含静态成员的静态类。只要您在想要

我正在编写一个Windows Phone应用程序。我想做的是,当应用程序启动时,它会得到一些数据(设置或其他什么),我希望这些数据在应用程序的整个生命周期中保持不变;i、 e.我不想在需要这段数据时一直读取IsolatedStorage或调用服务器

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

  • 我希望它符合MVVM
  • 我用的是Caliburn.Micro
  • 数据是只读的
  • 应用程序具有多个共享数据的页面/视图和视图模型

  • 提前感谢。

    如果我正确理解了您的问题,您可以使用包含静态成员的静态类。只要您在想要使用成员的地方引用此类,只要应用程序正在运行,这些成员就会存在


    如果我误解了“应用程序生命”,我会用另一个解决方案更新答案。

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

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

    当你的应用程序启动时,你创建一个
    设置的实例,从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类,并将其作为一个单例注册到容器中。然后将其注入任何需要使用它的ViewModels中。CM中的导航服务还使使用.WithParam在页面之间传递dta变得简单


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

    我误解了Caliburn是什么-出于某种原因,我认为它是一个DI容器。既然不是,我建议你用一个。就个人而言,我会使用,因为我熟悉它,但任何受支持的容器都可以工作。在应用程序初始化时,加载应用程序生命周期中需要的设置和任何其他服务,并将它们放入DI容器(或让容器为您创建它们)

    对于IoC,在应用程序初始化中的外观如下所示:

    // assuming MySettings will initialize itself in the ctor
    RootWorkItem.Services.AddNew<MySettings, IMySettings>();
    
    //假设MySettings将在ctor中初始化自身
    RootWorkItem.Services.AddNew();
    

    var settings=new MySettings();
    //初始化设置在这里
    RootWorkItem.Services.Add(设置);
    
    然后,在应用程序中的任何位置,只要您想要,就可以按接口类型拉取(解析):

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

    并使用返回的实例。在所有情况下,您都可以使用具体类型而不是接口,但我更喜欢使用接口,以便于测试和模拟。

    应用程序的生命周期是什么意思?要卸载的安装或只是从正在运行的安装到用户退出?另请参阅:另请参阅:另请参阅:另请参阅:您正确理解了问题。然而,我有一个问题;这与我的前两个要求是如何配合的?谢谢你的回答。让我做一些研究,然后回来。同时,如果你有更多的细节可以分享,我将不胜感激;代码,链接。。。等
    var settings = RootWorkItem.Services.Get<IMySettings>();