4

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

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

在我实现的架构中,View 有自己的项目(WPF),ViewModel 有自己的项目(类库)。从逻辑上讲,View 应该负责加载/保存视图相关设置,ViewModel 应该负责加载/保存业务设置。

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

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

我的第一个想法是创建一些辅助方法,允许我从 ViewModel 读取/写入 app.config 中的设置。你有什么意见?我是否在这里使事情复杂化,或者这是处理应用程序设置的可接受方式?

4

3 回答 3

3

您可以通过三种方式来这里。

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

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

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

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

于 2012-09-24T22:44:33.187 回答
0

如果您想将程序集分开并保持 ViewModel 可测试,这是一个更简洁的选项:

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

在您的 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;
        }
    }
}
于 2017-11-24T00:58:19.230 回答
0

这个库给我留下了深刻的印象:https ://www.nuget.org/packages/UserSettingsApplied/ 。它基本上允许您毫不费力地将您想要的任何内容序列化到用户的漫游应用程序配置中。它似乎经过深思熟虑并经过良好测试。这允许视图模型轻松地将设置保存在 app.config 中。

仅供参考,View 项目引用 View Model 是完全可以的。不仅如此,它几乎是强制性的,因此您的视图可以通过视图模型层完成所有持久性。

于 2017-11-24T01:52:17.080 回答