gpt4 book ai didi

c# - 在 WPF/MVVM 应用程序启动时加载配置文件/处理错误

转载 作者:行者123 更新时间:2023-12-03 17:49:55 26 4
gpt4 key购买 nike

免责声明:我之前没有 MVVM/MVC/MVP/MVWhatever 方面的经验,这是我第一次尝试使用 任意 UI 分离模式。
启动时,我的应用程序需要从配置文件加载数据,这是应用程序工作所必需的。
目前,我正在读取 App.xaml.cs 中启动时的配置文件,我将文件的内容传递给 View 模型:

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方式吗?
我确信这种方式比直接在 View 模型中读取文件更好(我首先是这样做的),但我不确定 App.xaml.cs完全是读取配置文件的正确位置。
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 的东西来代替它,但重点是:我仍然必须从某个地方调用它(然后关闭应用程序)。
我真正想知道的是 App.xaml.cs是正确的地方!
3. 另外,我还有一种错误要处理:
配置文件的实际解析由模型完成(模型是现有库的一部分,我在这里构建的 WPF 应用程序只是一个不错的 UI)。
因此, View 模型创建模型的实例并调用解析方法……如果配置文件中的数据无效,则会引发异常。
我该如何处理这个“MVVM方式”?
只是在 View 模型中捕获异常并从那里关闭整个应用程序对我来说是错误的。

编辑:
回答 Will 关于我为什么不使用 app.config 的评论:
我正在使用“特殊”配置文件,因为我需要从那里加载几个命名的“集合”值对。 Here's an example file .
基本上,它是 Dictionary<string, List<ClassWithTwoStringProperties>> .
  • 阿法克,app.config不支持这样的数据,所以我唯一能做的就是将整个内容保存为 中的 blob一个 位于 app.config 的属性(property),并且仍然自己进行解析。
    --> 所以我仍然需要从 WPF 应用程序的某个地方调用解析。
  • 我想要一个简单的、人工可编辑的格式
  • WPF 应用程序只是一个不错的库 UI,我还需要库中的配置文件
  • 最佳答案

    我认为,这种方式是不正确的。

    你应该考虑app.config与任何持久数据(例如数据库、文件)一样。如果您想以 MVVM 方式访问持久数据,您应该编写一个服务(类似于 IApplicationDataService )并从您的 MainWindowViewModel 调用此服务实现代码。如果您从一些 ServiceLocator 中找到此服务,它将更加 MVVMish。或通过 IoC 容器注入(inject) - 这有助于稍后编写单元测试。

    服务的实现应该返回 View 模型初始化模型实例。像这样的东西:

    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!
    }
    }
    }

    关于c# - 在 WPF/MVVM 应用程序启动时加载配置文件/处理错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12028710/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com