MVVM架构中的App.Config

时间:2012-09-24 22:31:46

标签: wpf mvvm

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

  1. 应用程序的外观:示例可以是窗口位置,窗口大小,视图上的默认选项等。
  2. 业务规则:业务逻辑将使用这些设置。
  3. 在我实现的架构中,View有自己的项目(WPF),ViewModel有自己的项目(类库)。从lofical的角度来看,View应负责加载/保存与视图相关的设置,ViewModel应负责加载/保存业务设置。

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

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

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

3 个答案:

答案 0 :(得分:1)

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

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

  2. 让ViewModel项目通过构造函数或其他Dependency Inversion方法询问所需的配置信息,并让View项目将其传入。

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

  4. 就个人而言,我会选择选项3,除非有某些原因他们需要分开组装。如果他们需要分开,那么我会赞成选项1,因为它更简单。

答案 1 :(得分: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;
        }
    }
}

答案 2 :(得分:0)

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

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