dotnet 6 和 netstandard 2.0 中 ConfigurationManager 的模拟,以及受保护的部分

Analog of ConfigurationManager in dotnet 6 and netstandard 2.0, and Protected Section

在 .net 框架中,我们曾经使用 web.config 或 app.config 和 ConfigurationManagerWebConfigurationManager 来读取配置部分。

2 项脱颖而出:

a) 框架加载了标准配置文件 (XML)。因此,当您从应用程序程序集中的 ANY DLL 调用 ConfigurationManager 时,您将获得通过应用程序域路由的部分或 appSettings

b) 可以有受保护的部分,即你放置一些开放的文本数据,当应用程序运行时,这些数据将被加密。

现在,在 .net 6 中,我们有很多关于 new 配置管理器的讨论 -Microsoft.Extensions.Configuration.ConfigurationManager.

起初 .net core 没有它,但微软很快又加回来了 System.Configuration.ConfigurationManager,现在可用于 net6.0netstandard2.0

关于如何直接从 class 库中使用 Microsoft.Extensions.Configuration.ConfigurationManager,我发现了零条信息。似乎都是为端点应用程序,执行程序集设计的。

我似乎明白,如果你真的想要这样的东西,there are ways of doing it 但所有这些似乎都过于复杂并且与 ASP.NET 核心直接相关。最后,并没有解决主要问题——如何从 DLL 处理这些受保护的配置。例如,在我的架构中,EF 内容位于端点应用程序的下 2 层。我不想在下面传递连接字符串。我希望我的 EF 层能够独立地找到加密连接,如果它是从控制台应用程序、测试项目或 Win Forms 调用的话。

是否有任何关于所有这些事情的指导 - “我们现在在 asp.net 核心中有这个 class”??

我来到这个解决方案来实现这个功能。它利用单例模式来实现这一点。再一次,这是一个原型。 3 个项目

  1. 配置库,包含以下单例代码。此代码以您想要的任何方式加载设置。
public class ConfigSingleton
{
    private static ConfigSingleton _instance;


    static ConfigSingleton()
    {
        _instance = new ConfigSingleton();
        _instance.Init();
    }


    public  static ConfigSingleton Instance { get { return _instance; } }
    public string StringSetting { get; private set; }
    public int IntSetting { get; private set; }
    public bool BoolSetting { get; private set; }
    public int InstanceId { get; private set; }

    private void Init()
    {
        IConfiguration Configuration = new msc.ConfigurationBuilder()
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .AddJsonFile("appsettings.development.json", optional: true, reloadOnChange: true)
            .AddEnvironmentVariables() 
            //.AddUserSecrets("bbbb",)
            
            //.AddCommandLine(args)
            .Build();
            
        var section = Configuration.GetSection("CustomSettingsSection");
        StringSetting = section.GetValue<string>("StringSetting");
        IntSetting = section.GetValue<int>("NumericSetting");
        BoolSetting = section.GetValue<bool>("BoolSetting");
        InstanceId = Guid.NewGuid().ToString().GetHashCode();
    }

}
  1. 正在使用库。这里的事情很简单
public static class ConfigWrapper
{
    public static ConfigSingleton GetConfig()
    {
        return ConfigSingleton.Instance;
    }
}
  1. 使用控制台应用程序,它使用上面的两个库并证明我们有相同的单例对象加载了我们的设置
public static void Main(string[] args)
{
    Console.WriteLine("wrapper config id: " + netstandard20.lib.ConfigWrapper.GetConfig().InstanceId);

    var boolSet = netstandard20.lib.ConfigWrapper.GetConfig().BoolSetting;
    Console.WriteLine("Bool from wrapper: " + boolSet);

    var intSet = netstandard20.lib.ConfigWrapper.GetConfig().IntSetting;
    Console.WriteLine("int from wrapper: " + intSet);

    var strSet = netstandard20.lib.ConfigWrapper.GetConfig().StringSetting;
    Console.WriteLine("string from wrapper: " + strSet);

    Console.WriteLine("= = = = = = = = = = = = = = = = = = = = = =");

    Console.WriteLine("config id: " + netstandard20.lib.config.ConfigSingleton.Instance.InstanceId);

    boolSet = netstandard20.lib.config.ConfigSingleton.Instance.BoolSetting;
    Console.WriteLine("Bool from config: " + boolSet);

    intSet = netstandard20.lib.config.ConfigSingleton.Instance.IntSetting;
    Console.WriteLine("int from config: " + intSet);

    strSet = netstandard20.lib.config.ConfigSingleton.Instance.StringSetting;
    Console.WriteLine("string from config: " + strSet);

    Console.Read();
}

这行得通。不确定这是否是一个“好主意”