Web.config配置

  •         以往在做 .Net项目的时候,一般都是以项目默认的web.config文件作为默认的配置文件来进行相关参数的配置,但是它也存在一些缺点,比如只能读取本地文件、安全风险、不利于管理等缺点,
  • .NET 中的配置系统支持丰富的配置源,包括文件(json、xml、ini等)、注册表、环境变量、命令行、Azure Key Vault等,还可以配置自定义配置源。可以跟踪配置的改变,可以按照优先级覆盖
Json文件配置

  1. 项目目录下创建appsettings.json文件,记得属性设置为“较新则复制”。
  2. NuGet安装Microsoft.Extension.Configuration和Microsoft.Extension.Configuration.Json两个包。
  3. 以下是实现代码appsettings.json文件内容如下:

 

static void Main(string[] args)
{
    ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
    configurationBuilder.AddJsonFile("appsettings.json", optional: false, true);
    IConfigurationRoot configurationRoot = configurationBuilder.Build();
    string name = configurationRoot["name"];
    Console.WriteLine($"name:{name}");
    string address = configurationRoot.GetSection("proxy:address").Value;
    Console.WriteLine($"address:{address}");
}

 注意:

  1. AddJsonFile方法的第二个参数,optional ,如果设置成false,则在编译的时候没找到指定文件的话,就会报错,如果设置成true,那么编译不会报错,程序执行若没找到文件就会报错;第三个参数reloadOnchange,是指是否再文件发生变化的时候重新加载;
  2. 如果参数不是在最外层的,比如上面的proxy里面的address配置,就需要GetSection方法,如果是在完成的,那就就可以直接用configuration[key]方法;
  3. Json文件里面所有的配置项都是字符串类型的

运行结果如下:

选项方式读取。配合DI

1、推荐使用选项方式读取,和DI结合更好,且更好利用 :“reloadonchange”机制。

2、NuGet安装:Microsoft.Extensions.Options.当然也需要

        Microsoft.Extensions.Configuration.Binder,

        Microsoft,Extensions.Configuration

        Microsoft,Extensions.Configuration.Json .

3、读取配置的时候,DI要声明IOptions<T>l0ptionsMonitor<T>、l0ptionsSnapshot<T>等类型:I0ptions<T>不会读取到新的值;和I0ptionsMonitor相比,l0ptionsMonitor会在同一个范围内(比如ASP.NET Core-个请求中)保持一致。建议用I0ptionsSnapshot。

第一步,创建配置信息类 

public class AppSettings
    {
        public string name { get; set; }

        public int age { get; set; }

        public Proxy proxy { get; set; }
    }


    public class Proxy
    {
        public string address { get; set; }

        public int port { get; set; }
    }

第二步,定义controller类,并在该类中实现对配置的DI注入,注意,这里用的方式不是简单的类注入,而是使用IOptionsSnapshot<T>类型,可以实现对配置信息的实时获取:

public class TestController
    {
        private readonly IOptionsSnapshot<AppSettings> _optionsSnapshot ;

        public TestController(IOptionsSnapshot<AppSettings> optionsSnapshot)
        {
            _optionsSnapshot = optionsSnapshot;
        }
        public void TestGetValue()
        {
            Console.WriteLine(_optionsSnapshot.Value.name);
            Console.WriteLine("*************************");
            Console.WriteLine(_optionsSnapshot.Value.age);
            Console.WriteLine("*************************");
            Console.WriteLine(_optionsSnapshot.Value.proxy.address);
            Console.WriteLine("*************************");
            Console.WriteLine(_optionsSnapshot.Value.proxy.port);
        }
    }

 第三步:通过DI获取TestController实例,并且获取配置信息

static void Main(string[] args)
        {

            ServiceCollection services = new ServiceCollection();
            services.AddScoped<TestController>();

            ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
            configurationBuilder.AddJsonFile("appsettings.json", optional: false, true);
            IConfigurationRoot configurationRoot = configurationBuilder.Build();

            //Config配置注入
            services.AddOptions().Configure<AppSettings>(e => configurationRoot.Bind(e)).
                Configure<Proxy>(e => configurationRoot.GetSection("proxy").Bind(e));
          
            using (ServiceProvider sp = services.BuildServiceProvider())
            {
                TestController controller = sp.GetRequiredService<TestController>();
                controller.TestGetValue();
                Console.WriteLine("--------------------------------------------");
             }
        }

 运行结果如下:

  • 此时,如果我们去修改debug目录下的appsettings.json 的内容是,程序获取的配置信息并不会发生改变,因为TestController是在同一个范围内Scope使用的,如果我们不在一个范围内去获取,则每次修改之后,会实时反映到获取的值中:如下:

static void Main(string[] args)
        {

            ServiceCollection services = new ServiceCollection();
            services.AddScoped<TestController>();

            ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
            configurationBuilder.AddJsonFile("appsettings.json", optional: false, true);
            IConfigurationRoot configurationRoot = configurationBuilder.Build();

            //Config配置注入
            services.AddOptions().Configure<AppSettings>(e => configurationRoot.Bind(e)).
                Configure<Proxy>(e => configurationRoot.GetSection("proxy").Bind(e));
          
            using (ServiceProvider sp = services.BuildServiceProvider())
            {
                while (true)
                {
                    using (var scope = sp.CreateScope())
                    {
                        TestController controller = scope.ServiceProvider.GetRequiredService<TestController>();
                        controller.TestGetValue();
                        Console.WriteLine("--------------------------------------------");
                    }
                    Console.ReadKey();
                }
            }
        }

我们修改一下年龄值:从46岁改成86岁

通过控制台获取的结果可以看到,获取到的配置信息也实时改变了:

  • 命令行参数

通过传递命令行数据作为参数,ConfigBuilder.AddCommandLine(args); 

当然,我们可以不在命令行参数,而是在项目->属性->调试界面,直接增加参数,如下

运行后同样可以获取参数:

  • 读取环境变量的配置: 

        与命令行参数配置类似,.net core还提供读取项目环境变量的功能,也是在项目的属性的调试菜单下配置:

 运行结果如下

  • 读取环境变量的方法还支持增加一个前缀的功能,比如项目环境变量名称和电脑环境变量冲突的话,那么就可以在项目的参数名称加上自定义的前缀,便于区分;

 

如下,我在每个环境变量节点名前面加了一个"a_"的前缀,

那么在获取的时候,就可以将这个前缀作为参数,来获取项目的环境变量值:

运行结果如下:

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐