c# – 在WPF / MVVM应用程序中启动时加载配置文件/处理错误
免责声明:我之前没有MVVM / MVC / MVP / MVWath的经验,这是我第一次尝试使用任何UI分离模式.
在启动时,我的应用程序需要从配置文件加载数据,这是应用程序工作所需的. 目前,我正在App.xaml.cs中启动时读取配置文件,并且我将文件的内容传递给视图模型: public partial class App : Application { protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); string configFile = "settings.txt"; string[] config = File.ReadAllLines(configFile); var window = new MainWindow(); var viewmodel = new MainWindowViewModel(config); window.DataContext = viewmodel; window.Show(); } } 1.这是“正确的”MVVM方式吗? 2.我在哪里/如何处理错误? 我的第一次尝试也是将它放在App.xaml.cs中: public partial class App : Application { protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); string configFile = "settings.txt"; if (!File.Exists(configFile)) { MessageBox.Show("config file missing"); Application.Current.Shutdown(); return; } string[] config = File.ReadAllLines(configFile); if (config.Count() == 0) { MessageBox.Show("config file empty"); Application.Current.Shutdown(); return; } var window = new MainWindow(); var viewmodel = new MainWindowViewModel(config); window.DataContext = viewmodel; window.Show(); } } 但这对我来说并不“正确”.我已经对在那里加载文件感到不舒服(参见第一个例子),所以这更糟糕. 注意:我知道我可能不应该直接在这里调用Messagebox.Show. 另外,我还有另一种错误: 我如何处理“MVVM方式”? 编辑: 回答Will关于我为什么不使用app.config的评论: 我正在使用“特殊”配置文件,因为我需要从那里加载几个命名的“值集”. Here’s an example file. > AFAIK,app.config不支持这样的数据,所以我唯一能做的就是将整个内容保存为app.config中的一个属性中的blob,并且仍然自己进行解析. 解决方法
我想,这种方式是不正确的.
您应该将app.config视为任何持久数据(例如数据库,文件).如果要以MVVM方式访问持久化数据,则应编写服务(类似于IApplicationDataService)并从MainWindowViewModel代码中调用此服务实现.如果您将从某个ServiceLocator中找到此服务或通过IoC容器注入它,那么它将更加MVVMish – 这有助于稍后编写单元测试. 服务的实现应返回查看模型初始化的模型实例.像这样的东西: public ApplicationDataService : IApplicationDataService { public ApplicationModel LoadApplicationData() { // process app.config here } } public ViewModelBase<TModel> { public TModel Model { get { return model.Value; } } private readonly Lazy<TModel> model = new Lazy(GetModel); protected abstract TModel GetModel(); } public MainWindowViewModel<ApplicationModel> : ViewModelBase { protected override ApplicationModel GetModel() { try { var dataService = ServiceLocator.GetService<IApplicationDataService>(); return dataService.LoadApplicationData(); } catch (AnyException e) { // oops! } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |