Windows phone 7 如何:在Windows Phone中实现数据持久化
我正在编写一个Windows Phone应用程序。我想做的是,当应用程序启动时,它会得到一些数据(设置或其他什么),我希望这些数据在应用程序的整个生命周期中保持不变;i、 e.我不想在需要这段数据时一直读取IsolatedStorage或调用服务器 最好的方法是什么(加载和共享)?铭记以下几点: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 数据是只读的 应用程序具有多个共享数据的页面/视图和视图模型 提前感谢。如果我正确理解了您的问题,您可以使用包含静态成员的静态类。只要您在想要
提前感谢。如果我正确理解了您的问题,您可以使用包含静态成员的静态类。只要您在想要使用成员的地方引用此类,只要应用程序正在运行,这些成员就会存在
如果我误解了“应用程序生命”,我会用另一个解决方案更新答案。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>();