ConfigurationManager姿势快闪

news/2024/7/10 2:24:28 标签: java, android, spring, spring boot, vue

最近一个祖传代码是使用.NET Fx写就的,我在使用控制台程序获取配置时有些折腾。

下面记录一些管理配置文件的姿势:

ConfigurationManager用于在客户机应用程序中获取配置信息;对于web项目,请使用WebConfigurationManager类。

ConfigurationManager使用姿势

  1. 添加app.config文件

<configuration>
   <appSettings>
  <add key="ProjectName" value="cvg.java.api.productcenter" />
  </appSettings>
  <connectionStrings>
    <add name="DBConnection" connectionString="Data Source=(LocalDB)\v11.0;Initial Catalog=WingtipToys;Integrated Security=True;Pooling=False"/>
  </connectionStrings>
</configuration>
  1. 注意:编译之后app.config配置节会进入可执行文件的配置文件Demo.exe.config

  2. ConfigurationManager.AppSettings["key1"]
    ConfigurationManager.ConnectionStrings["DBConnection"] 用于从应用的默认配置中获取程序配置、连接字符串配置, 这也是ConfigurationManager最常规的用法。

  3. 如何读取外部配置?

     将所有配置信息放在一个配置文件显得非常混乱,特别是[密码管理]的时候, 可能会划分多个配置文件。ConfigurationManager支持项目中创建另外的配置文件。

------ app.config文件-----
<configuration>
 <connectionStrings configSource="DBConnectionStrings.config" />
</configuration>

----- DBConnectionString.config文件, 这里已经不需要configuration顶级配置节---- 
<?xml version="1.0" encoding="utf-8"?>
<connectionStrings>
 <add name="DBConnection" connectionString="Data Source=(LocalDB)\v11.0;Initial Catalog=WingtipToys;Integrated Security=True;Pooling=False"  />
</connectionStrings>

附加的这个文件不会进Demo.exe.config文件,可以想象到,当需要隐藏该文件配置,可以不把该文件加入代码管理。

  1. ConfigurationManager支持Machine,User,Exe三个级别的配置文件, 可以通过ExeConfigurationFileMap加载特定位置的配置文件。

var configFileMap = new ExeConfigurationFileMap()
    {
        ExeConfigFilename = @"E:\Test\WpfApp2\bin\Debug\PositionConfig.config"
    };
    var v = ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None);

我们顺便看下微软是如何编写工具库文件,ConfigurationManager 是一个静态类,静态构造函数,

在使用静态方法 AppSettings["key1"]索引配置时,必须先确保配置文件已经就绪,注意下面的PrepareConfigSystem==>EnsureConfigurationSystem方法

public static object GetSection(string sectionName)
        {
            if (string.IsNullOrEmpty(sectionName))
            {
                return null;
            }

            PrepareConfigSystem();
            return s_configSystem.GetSection(sectionName);
        }
        
          private static void PrepareConfigSystem()
        {
            if (s_initState < InitState.Usable)
            {
                EnsureConfigurationSystem();
            }

            if (s_initError != null)
            {
                throw s_initError;
            }
        }

使用了一个状态字段来表征初始化过程, 注意这里使用了一个lock防止并发下被多次初始化

private static void EnsureConfigurationSystem() {
            // If a configuration system has not yet been set, 
            // create the DefaultConfigurationSystem for exe's.
            lock (s_initLock) {
                if (s_initState < InitState.Usable) {
                    s_initState = InitState.Started;
                    try {
                        try {
                            s_configSystem = new ClientConfigurationSystem();
                            s_initState = InitState.Usable;
                        }
                        catch (Exception e) {
                            s_initError = new ConfigurationErrorsException(SR.GetString(SR.Config_client_config_init_error), e);
                            throw s_initError;
                        }
                    }
                    catch {
                        s_initState = InitState.Completed;
                        throw;
                    }
                }
            }
        }

本文算是简短的技术快闪,记录了ConfigurationManager 的使用姿势和微软工具库的一般开发模式。


http://www.niftyadmin.cn/n/1864419.html

相关文章

使用 Google Gears 开发离线应用

Google 在 2007 年 5 月发布了 Gears&#xff0c;它是一种为生成离线网络应用软件而开发的开源技术&#xff0c;Google 希望能在广大开发者的帮助下测试完善功能和发现产品的局限性。简单地说&#xff0c;它是 Google 推出的开源的浏览器插件&#xff0c;而开发者围绕着这个插件…

深入解读Golang信道

信道是一个golang goroutine之间很关键的通信媒介。 理解golang的信道很重要&#xff0c;这里记录平时易忘记的、易混淆的点。 1. 基本使用 刚声明的信道&#xff0c;零值为nil&#xff0c;无法直接使用&#xff0c;需配合make函数进行初始化 ic : make(chan int)ic <-22 …

使用curl指令发起websocket请求

昨日的文章没指出websocket请求协商切换的精髓&#xff0c;删除重发。前文相关&#xff1a;• .NET WebSockets 核心原理初体验[1]• SignalR 从开发到生产部署避坑指南[2]tag&#xff1a;浏览器--->nginx--> server其中提到nginx默认不会为客户端转发Upgrade、Connectio…

Go语言反向代理的姿势

先重温一下什么叫反向代理&#xff0c;正向代理。鹅厂二面&#xff0c;nginx回忆录 所谓正向&#xff0c;反向代理取决于代理的是出站请求&#xff0c;还是入站请求。 正向代理&#xff1a; 代理的出站请求&#xff0c; 客户端能感知到代理程序&#xff0c;架构上距离客户端更近…

ConcurrentDictionary字典操作竟然不全是线程安全的?

好久不见&#xff0c;马甲哥封闭居家半个月&#xff0c;记录之前遇到的一件小事。 标题不准确&#xff0c;实际上ConcurrentDictionary<TKey,TValue>绝大部分api都是线程安全且原子性的[1]&#xff0c; 唯二的例外是接收工厂函数的api&#xff1a;AddOrUpdate、GetOrAdd&…

面向对象五大设计原则

最近在看七牛云许式伟的架构课, 重温了面向对象五大设计原则(SOLID)&#xff0c;扣理论文字找出处。&#xff08;当然许老板是不可能深聊这么低级的内容&#xff0c;&#x1f921;&#xff09; 注意区分设计原则和设计模式。 设计原则更为抽象和泛化&#xff1b; 设计模式也是抽…

两将军问题和TCP三次握手

两将军问题&#xff0c;又被称为两将军悖论、两军问题&#xff0c; 是一个经典的计算机思想实验。 首先&#xff0c; 为避免混淆&#xff0c;我们需要认识到两将军问题虽然与拜占庭将军问题相关&#xff0c;但两者不是一个东西。拜占庭将军问题是一个更通用的两将军问题版本&am…

Go语言正/反向代理的姿势

先重温一下什么叫反向代理&#xff0c;正向代理。鹅厂二面&#xff0c;nginx回忆录[1]所谓正向&#xff0c;反向代理取决于代理的是出站请求&#xff0c;还是入站请求。正向代理&#xff1a;代理的出站请求&#xff0c; 客户端能感知到代理程序&#xff0c;架构上距离客户端更近…