我正在写一个Windows Phone应用程序。我想做的是,当应用程序启动时,它会获取一些数据(设置或其他)我希望这些数据在应用程序的整个生命周期中持续存在;例如,我不想一直读取IsolatedStorage或每当我需要那块数据时调用服务器。
最好的方法是什么(加载和共享)?考虑到以下几点:
- 我希望它是MVVM兼容 我用的是Caliburn。微
- 数据为非只读
- 应用程序有多个共享数据的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>();
并使用返回的实例。您也可以在所有情况下使用具体类型而不是接口,但是我更倾向于使用接口来允许更容易的测试和模拟。