配置文件


.NET 中的配置系统支持丰富的配置源,包括文件(json、xml、ini等)、注册表、环境变量、命令行、阿波罗等,还可以配置自定义配置源。可以跟踪配置的改变,可以按照优先级覆盖。

通过Json文件配置

安装对应包

Install-Package Microsoft.Extensions.Configuration

Install-Package Microsoft.Extensions.Configuration.Json

Install-Package Microsoft.Extensions.Configuration.Binder

using Microsoft.Extensions.Configuration;
using System;

namespace ConsoleApp1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
            configurationBuilder.AddJsonFile("Myconfig.json", optional: true, reloadOnChange: true);
            var configRoot = configurationBuilder.Build();
            string name = configRoot["Name"];
            Console.WriteLine(name);
            string address = configRoot.GetSection("Other:Address").Value;
            Console.WriteLine(address);
            var other = configRoot.GetSection("Other").Get();
            Console.WriteLine(other.Tel);
            var myConfig = configRoot.Get();
            Console.WriteLine(myConfig.Name);
        }
    }

    class MyConfig
    {
        public string Name { get; set; }

        public string Age { get; set; }

        public Other Other { get; set; }
    }

    class Other
    {
        public string Address { get; set; }

        public string Tel { get; set; }
    }
}
原始读取方式

选项方式读取,和DI结合更好,且更好利用”reloadonchange“机制

安装对应包

Install-Package Microsoft.Extensions.Options

相关概念

DI要声明 IOptions、IOptionsMonitor、IOptionsSnapshot等类型

IOptions不会读取到新的值 和IOptionsMonitor相比,IOptionsSnapshot会在同一范围内保持一致,建议使用IOptionsSnapshot

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System;

namespace ConsoleApp1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            var services = new ServiceCollection();
            services.AddScoped();
            
            ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
            configurationBuilder.AddJsonFile("Myconfig.json", optional: true, reloadOnChange: true);
            var configRoot = configurationBuilder.Build();

            services.AddOptions().Configure(e=>configRoot.Bind(e));              
            using (var sp = services.BuildServiceProvider())
            {
                var dIConfigClass = sp.GetRequiredService();
                dIConfigClass.Test();
            }
        }
    }

    public class MyConfig
    {
        public string Name { get; set; }

        public string Age { get; set; }

        public Other Other { get; set; }
    }

    public class Other
    {
        public string Address { get; set; }

        public string Tel { get; set; }
    }
}
结合DI读取配置-1
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Extensions.Options;

namespace ConsoleApp1
{
    public class DIConfigClass
    {
        public readonly IOptionsSnapshot _optionsSnapshot;
        public DIConfigClass(IOptionsSnapshot optionsSnapshot)
        {
            _optionsSnapshot = optionsSnapshot;
        }

        public void Test()
        {
            Console.WriteLine(_optionsSnapshot.Value.Name);
            Console.ReadKey();
        }
    }
}
结合DI读取配置-2