【问题标题】:App.Config in MVVM architectureMVVM 架构中的 App.Config
【发布时间】:2012-09-24 22:31:45
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: wpf mvvm


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      如果您希望将程序集分开并保持 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;
              }
          }
      }
      

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 2016-06-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-05
          • 2020-04-07
          • 1970-01-01
          • 2012-10-28
          相关资源
          最近更新 更多