【问题标题】:User Configuration Settings in .NET Core.NET Core 中的用户配置设置
【发布时间】:2018-07-15 19:18:36
【问题描述】:

我昨天花了一整天的时间研究这个问题,但找不到任何合理的解决方案。

我正在将 .NET Framework 项目移植到 .NET Core 2.0。该项目使用用户设置 (Properties.Settings.Default) 来存储某些信息,这些信息会在每次应用程序启动时持续存在。它还可以更新此信息(例如用户偏好选项)。

我的理解是 .NET Core 中不存在?那么如何才能做到这一点呢?我能找到的最接近的方法是安装几个 NuGet 包并使用 Microsoft.Extensions.Configuration,但是,这甚至与 .NET Framework 中的 Properties.Settings.Default 相差甚远。

首先,它需要一个文件(JSON,XML,你有什么)在运行文件的目录中。这似乎很疯狂,尤其是在安全信息的情况下。此外,当我的项目的内部库应该能够处理所有配置文件时,我不想将配置文件与项目一起推送,就像 .NET Framework 一样。

我知道有环境变量,但我无法让它们在我的一生中加载。老实说,这应该是一个简单的过程,所以我不确定我是否遗漏了一些明显的东西。在这里,在我的库的 Properties>Debug 部分中,有一个名为“Environment variables”的部分,我在其中添加了两个值。

我的配置对象如下所示:

private static IConfiguration Configuration { get; } = new ConfigurationBuilder()
    //.SetBasePath(Directory.GetCurrentDirectory())
    //.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
    .AddEnvironmentVariables()
    .Build();

为了访问变量,我尝试了以下方法:

Configuration.GetSection("SettingName").Value;
Configuration["SettingName"];
Environment.GetEnvironmentVariable("SettingName");

它们都返回空。

另外,有没有办法保存属性?我知道它的设计目的是为了减轻重量,但肯定有节省的方法吗?

我试过了:

Configuration["SettingName"] = "Value";
Environment.SetEnvironmentVariable("SettingName", "Value");

它似乎更新了内存,而不是文件本身,这使得持久设置无用。

如何在库中读取和保存用户设置,同时将其全部包含在该库中?

【问题讨论】:

标签: c# configuration .net-core settings


【解决方案1】:

我创建了一个静态类,如果需要,用户可以在任何地方访问它。这并不完美,但它是强类型的,并且仅在访问默认属性时创建。

我打算使用 DI 将配置放入每个类的属性中,但在某些情况下,我希望将类放在构造函数中。

用途:

public MainWindow()
{
    InitializeComponent();

    var t = AppSettings.Default.Theme;
    AppSettings.Default.Theme += "b";
    AppSettings.Default.Save();
}

班级:

using Microsoft.Extensions.Configuration;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

namespace TestClient
{

    public class AppSettings
    {
        private AppSettings()
        {
            // marked as private to prevent outside classes from creating new.
        }

        private static string _jsonSource;
        private static AppSettings _appSettings = null;
        public static AppSettings Default
        {
            get
            {
                if (_appSettings == null)
                {
                    var builder = new ConfigurationBuilder()
                        .SetBasePath(Directory.GetCurrentDirectory())
                        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);

                    _jsonSource = $"{Directory.GetCurrentDirectory()}{Path.DirectorySeparatorChar}appsettings.json";

                    var config = builder.Build();
                    _appSettings = new AppSettings();
                    config.Bind(_appSettings);
                }

                return _appSettings;
            }
        }

        public void Save()
        {
            // open config file
            string json = JsonConvert.SerializeObject(_appSettings);

            //write string to file
            System.IO.File.WriteAllText(_jsonSource, json);
        }

        public string Theme { get; set; }
    }
}

【讨论】:

  • 这是一个有趣的解决方案,但你也可以在 json 文件中创建多个级别吗?我想应用一些分组和稍微复杂一点的场景。
猜你喜欢
  • 2018-02-18
  • 1970-01-01
  • 2021-04-24
  • 1970-01-01
  • 1970-01-01
  • 2018-04-01
  • 2018-10-13
  • 2020-08-22
  • 1970-01-01
相关资源
最近更新 更多