MVVM体系结构中的应用程序配置



每个应用程序都包含一些可配置的设置。这些设置或多或少可以分为两类:

  1. 应用程序的外观:例如窗口位置、窗口大小、视图上的默认选项等
  2. 业务规则:这些设置将由业务逻辑使用

在我实现的体系结构中,View有自己的项目(WPF),ViewModel有自己的工程(类库)。从布局的角度来看,View应该负责加载/保存与视图相关的设置,ViewModel应该负责加载和保存业务设置。

视图设置很容易处理。在设置(app.config)中创建所需的属性,它很容易加载并保存。

但是,ViewModel无法通过View项目中可用的内置机制访问app.config设置。

我的第一个想法是制作一些助手方法,使我能够从ViewModel中读取/写入app.config中的设置。你的意见是什么?我是不是把这里的东西弄复杂了,还是这是处理应用程序设置的一种可以接受的方式?

这里有三种方法。

  1. 添加对System.Configuration.dll的引用,并让ViewModel项目正常使用ConfigurationManager。

  2. 让ViewModel项目通过构造函数或其他依赖反转方法请求它所需的配置信息,并让View项目将其传递进来。

  3. 将ViewModels和Views放入主应用程序项目中。

就我个人而言,我会选择选项3,除非有某种原因需要将它们放在单独的程序集中。如果它们需要分开,那么我会选择选项1,因为它更简单。

如果您想保持程序集的独立性并保持ViewModels的可测试性,这里有一个更干净的选项:

在ViewModel项目中,添加一个接口,该接口提供用于检索和保存业务设置的方法或属性。让ViewModels在其构造函数中将此接口作为依赖项接受。

在View项目中,添加一个实现此接口并与Settings对话的类例如

namespace ViewModel
{
public interface IBusinessSettingsStore
{
public string SomeSetting { get; set; }
public int AnotherSetting { get; set; }
}
public class SomeViewModel
{
private IBusinessSettingsStore _businessSettings;
public SomeViewModel(IBusinessSettingsStore businessSettings)
{
_businessSettings = businessSettings;
}
private void DoSomething()
{
Console.WriteLine(_businessSettings.SomeSetting);
_businessSettings.AnotherSetting = 10;
}
}
}
namespace View
{
public class BusinessSettingsStore : IBusinessSettingsStore
{
public string SomeSetting
{
get => Settings.Default.SomeSetting;
set => Settings.Default.SomeSetting = value;
}
public int AnotherSetting
{
get => Settings.Default.AnotherSetting;
set => Settings.Default.AnotherSetting = value;
}
}
}

我对这个库印象深刻:https://www.nuget.org/packages/UserSettingsApplied/.它基本上允许您将想要的任何内容序列化到用户的漫游应用程序配置中,而无需任何努力。这似乎是经过深思熟虑和充分测试的。这使得视图模型可以轻松地将设置持久化到app.config中。

仅供参考,视图项目引用视图模型是完全可以的。除此之外,它几乎是强制性的,因此您的视图可以通过视图模型层实现其所有持久性。

相关内容

最新更新