zoukankan      html  css  js  c++  java
  • 在.NET CORE中使用配置文件:对 ConfigurationBuilder 的使用说明

    示例:ASP.NET MVC

    asp.net mvc已经内部实现了对配置appsettings.json文件的使用,builder默认支持热更新。

    使用示例:

    假设appsettings.json内容为:

        {
          "Logging": {
            "LogLevel": {
              "Default": "Warning"
            }
          },
          "AllowedHosts": "*"
        }
    
    1. 新建一个跟appsettings.json结构保持一致的类,如:
        namespace webapp.Models
        {
            public class AppsettingsModel
            {
                public Logging Logging { get; set; }
    
                public string AllowedHosts { get; set; }
            }
    
            public class Logging
            {
                public LogLevel LogLevel { get; set; }
            }
    
            public class LogLevel
            {
                public string Default { get; set; }
            }
        }
    

    PS:

    • 需要注意,用于IOptions或者IOptionsSnapshot中的模型的各个属性,其setter必须是公共的,不能是私有。

    • 另外对于该模型,必须要有一个无参构造函数。

    1. 在Startup.cs中进行依赖注入
            public void ConfigureServices(IServiceCollection services)
            {
                services.Configure<CookiePolicyOptions>(options =>
                {
                    options.CheckConsentNeeded = context => true;
                    options.MinimumSameSitePolicy = SameSiteMode.None;
                });
                // 依赖注入
                services.Configure<AppsettingsModel>(Configuration);
                services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
            }
    
    1. 在controller中调用:
        public class TestController : Controller
        {
            private readonly AppsettingsModel _appsettingsModel;
            //若要使用热更新,则入参调整为 IOptionsSnapshot<T>
            public TestController(IOptions<AppsettingsModel> appsettingsModel)
            {
                _appsettingsModel = appsettingsModel.Value;
            }
    
            public IActionResult Index()
            {
                return View("Index", _appsettingsModel.Logging.LogLevel.Default);
            }
        }
    
    • 这里需要注意一点,DI时,如果是单例,则无法使用是IOptionsSnapshot,会报错。

    如何覆写默认行为?如取消热更新支持,方法如下:

    假设测试controller为

        public class TestController : Controller
        {
            private readonly AppsettingsModel _appsettingsModel;
            //使用的是:IOptionsSnapshot<T>
            public TestController(IOptionsSnapshot<AppsettingsModel> appsettingsModel)
            {
                _appsettingsModel = appsettingsModel.Value;
            }
    
            public IActionResult Index()
            {
                return View("Index", _appsettingsModel.Logging.LogLevel.Default);
            }
        }
    

    Program.cs

        public class Program
        {
            public static void Main(string[] args)
            {
                CreateWebHostBuilder(args).Build().Run();
            }
    
            public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
                WebHost.CreateDefaultBuilder(args)
                    .ConfigureAppConfiguration((context, config) => //1.通过该方法来覆盖配置
                    {
                        //2.重新添加json配置文件
                        config.AddJsonFile("appsettings.json", false, false); //3.最后一个参数就是是否热更新的布尔值
                    })
                    .UseStartup<Startup>();
        }
    

    • 这个时候,人为将热更新给关闭了,此时更新json文件后,修改后的内容不会更新到系统中。

    示例:控制台

    对于console项目,默认是没有这个dll的,需要自行从nuget安装

    从nuget中安装:Microsoft.AspNetCore.All (注意,末尾不是dll,而是all)

    在项目中引入:Microsoft.Extensions.Configuration; 并使用ConfigurationBuilder来构建配置。

    使用应用程序参数

    在控制台项目属性中增加name和class参数:

    使用:

    class Program
    {
        static void Main(string[] args)
        {
            var builder = new ConfigurationBuilder()
                .AddCommandLine(args);
            var configuration = builder.Build();
    
            Console.WriteLine($"name:{configuration["name"]}"); //name:CLS
            Console.WriteLine($"class:{configuration["class"]}");   //class:Class_A
    
            Console.Read();
        }
    }
    

    使用键值对枚举(这里以字典来说明)

        class Program
        {
                    static void Main(string[] args)
                    {
                        var dict = new Dictionary<string, string>
                        {
                            {"name","MC"},
                            {"class","CLASS_MC"}
                        };
                        var builder = new ConfigurationBuilder()
    //                    .AddCommandLine(args)
                        .AddInMemoryCollection(dict);
            
                        var configuration = builder.Build();
            
                        Console.WriteLine($"name:{configuration["name"]}");//name:MC
                        Console.WriteLine($"class:{configuration["class"]}");  //class:CLASS_MC
            
                        Console.Read();
                    }
        }
    

    注意事项:

    • 这里需要注意下,虽然 AddCommandLine 和 AddInMemoryCollection 可以同时调用,但不同的使用次序,效果是不一样的(后一个会覆盖前一个的内容---浅覆盖),如:
     /*
        假设 在项目属性中,定义的内容为:name=CLS,class=CLASS_CLS,grade="mygrade"
        在代码中,dict的内容为:name=MC,class=CLASS_MC
     */
    //对于代码:
    var builder = new ConfigurationBuilder()
                        .AddCommandLine(args)
                        .AddInMemoryCollection(dict);
                        var configuration = builder.Build();
            
                        Console.WriteLine($"name:{configuration["name"]}");//name:MC
                        Console.WriteLine($"class:{configuration["class"]}");  //class:CLASS_MC
                        Console.WriteLine($"grade:{configuration["grade"]}");  //grade:mygrade
                        
    //对于代码:
    var builder = new ConfigurationBuilder()                    
                        .AddInMemoryCollection(dict)
                        .AddCommandLine(args);
                        var configuration = builder.Build();
            
                        Console.WriteLine($"name:{configuration["name"]}");//name:CLS
                        Console.WriteLine($"class:{configuration["class"]}");  //class:CLASS_CLS
                        Console.WriteLine($"grade:{configuration["grade"]}");  //grade:mygrade
    
    
    • 另外,需要注意,如果用dotnet命令来执行CommandLineSample.dll,那么“应用程序参数”需要直接跟在命令的后面,如:
      • 另外如果AddInMemoryCollection和AddCommandLine同时使用,那么需要将AddCommandLine最后调用,否则一旦被覆盖了,再用dotnet来调用,会没有效果。
     dotnet   CommandLineSample.dll   name=111 class=222  grade="my grade"
    

    使用JSON文件

    • 在项目根目录创建“jsconfig1.json”,同时修改该文件的属性:
      • 复制到输出目录:始终复制
      • 生成操作:内容

    JSON文件内容:

    {
          "Class": "Class A",
          "PersonInfo": {
                "name": "my name",
                "age": "12"
          },
          "Hobbies": [
                {
                      "Type": "Family",
                      "HobbyName": "Piano"
                },
                {
                      "Type": "Personal",
                      "HobbyName": "Singing"
                }
          ]
    }
    

    代码:

    static void Main(string[] args)
    {
        var builder = new ConfigurationBuilder()
            .AddJsonFile("jsconfig1.json");
    
        var configuration = builder.Build();
    
        Console.WriteLine($"name:{configuration["PersonInfo:name"]}");
        Console.WriteLine($"class:{configuration["class"]}");
        Console.WriteLine($"age:{configuration["PersonInfo:age"]}");
        //注意下调用参数时的格式:"{参数Key}:{数组索引}:{子项参数Key}"
        Console.WriteLine($"FamilyHobby:{configuration["Hobbies:0:HobbyName"]}");
        Console.WriteLine($"PersonalHobby:{configuration["Hobbies:1:HobbyName"]}");
    
        Console.Read();
    }
    

    注册配置文件中的某一个段到一个class模型中

    引用上面的json:

    {
          "Class": "Class A",
          "PersonInfo": {
                "name": "my name",
                "age": "12"
          },
          "Hobbies": [
                {
                      "Type": "Family",
                      "HobbyName": "Piano"
                },
                {
                      "Type": "Personal",
                      "HobbyName": "Singing"
                }
          ]
    }
    

    如何在注册的时候希望将PersonInfo这个section单独注入到 PersonInfo.cs类中?(以mvc为例)

    • PersonInfo.cs
    public class PersonInfo
    {
        public string Name {get;set;}
        public int Age{get;set;}
    }
    
    • Startup.cs
    
            public void ConfigureServices(IServiceCollection services)
            {
                services.Configure<CookiePolicyOptions>(options =>
                {
                    options.CheckConsentNeeded = context => true;
                    options.MinimumSameSitePolicy = SameSiteMode.None;
                });
                // 依赖注入
                services.Configure<PersonInfo>(Configuration.GetSection("PersonInfo"));
    
                services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
            }
    
    • 在controller中使用:
        public class TestController : Controller
        {
            private readonly PersonInfo   _personInfo;
            public TestController(IOptions<PersonInfo> personInfo)
            {
                _personInfo = _personInfo.Value;
            }
    
            public IActionResult Index()
            {
                return View("Index", _personInfo.Name);
            }
        }
    
    • 在 startup.cs中使用
    //jwt           
    services.Configure<JwtSettings>(Configuration.GetSection("JwtSettings"));
    
    var jwtSettings = new JwtSettings();
    Configuration.Bind("JwtSettings", jwtSettings);
    services.AddSanbenTechJwtService(jwtSettings.Issuer, jwtSettings.Audience);
    

    示例:在单元测试中使用 配置文件

    首先确保配置文件的属性:

    nuget安装、引入必要的库:

    Microsoft.Extensions.Configuration
    Microsoft.Extensions.Configuration.Binder
    Microsoft.Extensions.Configuration.Json
    

    在构造函数中使用配置文件:

            public UnitTest1()
            {
                var builder = new ConfigurationBuilder()
                    .AddJsonFile("appsettings.json");
                var configuration = builder.Build();
                var settings = configuration.GetSection("RedisSettings").Get<RedisSettings>();
                _mock.Setup(p => p.Value).Returns(settings);
            }
    

    一个官方例子

    https://docs.microsoft.com/zh-cn/aspnet/core/security/app-secrets?view=aspnetcore-2.2&tabs=windows

    {
      "Movies": {
        "ServiceApiKey": "12345",
        "ConnectionString": "Server=(localdb)\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true"
      }
    }
    

    配置模型:

    public class MovieSettings
    {
        public string ConnectionString { get; set; }
    
        public string ServiceApiKey { get; set; }
    }
    
    //使用
    var moviesConfig = Configuration.GetSection("Movies").Get<MovieSettings>();
    _moviesApiKey = moviesConfig.ServiceApiKey;
    

    FAQ

    1. 在使用AddJsonFile的时候,被添加的json文件需要在项目所处根目录内,否则不会加载(路径默认是到项目文件夹,而非bin目录下)。打包发布后会自动从发布文件夹找对应的配置文件
      • 这里主要是为了应对新建了一个项目A,然后在这个项目A中添加了一个配置文件config.json,项目B引用这个项目A后,虽然最终编译之后会在bin文件夹内自动生成config.json,但是在调试模式下,默认的路径是在项目路径,而非bin下的文件夹路径,这会导致config.json在开发模式下(调试时)不会被加载。
        • 可以手动将改config.json文件复制一份到项目B根目录内。
        • 如果是用nuget发布项目A后,项目B再从nuget安装项目A,则不会有此问题。
    %5Btoc%5D%0A%23%20%E7%A4%BA%E4%BE%8B%EF%BC%9AASP.NET%20MVC%0A%3E%20asp.net%20mvc%E5%B7%B2%E7%BB%8F%E5%86%85%E9%83%A8%E5%AE%9E%E7%8E%B0%E4%BA%86%E5%AF%B9%E9%85%8D%E7%BD%AEappsettings.json%E6%96%87%E4%BB%B6%E7%9A%84%E4%BD%BF%E7%94%A8%EF%BC%8Cbuilder%E9%BB%98%E8%AE%A4%E6%94%AF%E6%8C%81%E7%83%AD%E6%9B%B4%E6%96%B0%E3%80%82%0A%0A%23%23%20%E4%BD%BF%E7%94%A8%E7%A4%BA%E4%BE%8B%EF%BC%9A%0A%E5%81%87%E8%AE%BEappsettings.json%E5%86%85%E5%AE%B9%E4%B8%BA%EF%BC%9A%0A%0A%60%60%60json%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%22Logging%22%3A%20%7B%0A%20%20%20%20%20%20%20%20%22LogLevel%22%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%22Default%22%3A%20%22Warning%22%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%22AllowedHosts%22%3A%20%22*%22%0A%20%20%20%20%7D%0A%60%60%60%0A%0A1.%20%E6%96%B0%E5%BB%BA%E4%B8%80%E4%B8%AA%E8%B7%9Fappsettings.json%E7%BB%93%E6%9E%84%E4%BF%9D%E6%8C%81%E4%B8%80%E8%87%B4%E7%9A%84%E7%B1%BB%EF%BC%8C%E5%A6%82%EF%BC%9A%0A%0A%60%60%60csharp%0A%20%20%20%20namespace%20webapp.Models%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20public%20class%20AppsettingsModel%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20public%20Logging%20Logging%20%7B%20get%3B%20set%3B%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20public%20string%20AllowedHosts%20%7B%20get%3B%20set%3B%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20public%20class%20Logging%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20public%20LogLevel%20LogLevel%20%7B%20get%3B%20set%3B%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20public%20class%20LogLevel%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20public%20string%20Default%20%7B%20get%3B%20set%3B%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%60%60%60%0A%0A%3E%20PS%EF%BC%9A%0A%3E%20%0A%3E%20-%20%E9%9C%80%E8%A6%81%E6%B3%A8%E6%84%8F%EF%BC%8C%E7%94%A8%E4%BA%8EIOptions%E6%88%96%E8%80%85IOptionsSnapshot%E4%B8%AD%E7%9A%84%E6%A8%A1%E5%9E%8B%E7%9A%84%E5%90%84%E4%B8%AA%E5%B1%9E%E6%80%A7%EF%BC%8C%E5%85%B6setter%E5%BF%85%E9%A1%BB%E6%98%AF%E5%85%AC%E5%85%B1%E7%9A%84%EF%BC%8C%E4%B8%8D%E8%83%BD%E6%98%AF%E7%A7%81%E6%9C%89%E3%80%82%0A%3E%20%0A%3E%20-%20%E5%8F%A6%E5%A4%96%E5%AF%B9%E4%BA%8E%E8%AF%A5%E6%A8%A1%E5%9E%8B%EF%BC%8C%E5%BF%85%E9%A1%BB%E8%A6%81%E6%9C%89%E4%B8%80%E4%B8%AA%E6%97%A0%E5%8F%82%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0%E3%80%82%0A%0A2.%20%E5%9C%A8Startup.cs%E4%B8%AD%E8%BF%9B%E8%A1%8C%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5%0A%60%60%60csharp%0A%20%20%20%20%20%20%20%20public%20void%20ConfigureServices(IServiceCollection%20services)%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20services.Configure%3CCookiePolicyOptions%3E(options%20%3D%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20options.CheckConsentNeeded%20%3D%20context%20%3D%3E%20true%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20options.MinimumSameSitePolicy%20%3D%20SameSiteMode.None%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5%0A%20%20%20%20%20%20%20%20%20%20%20%20services.Configure%3CAppsettingsModel%3E(Configuration)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%60%60%60%0A%0A3.%20%E5%9C%A8controller%E4%B8%AD%E8%B0%83%E7%94%A8%EF%BC%9A%0A%0A%60%60%60csharp%0A%20%20%20%20public%20class%20TestController%20%3A%20Controller%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20private%20readonly%20AppsettingsModel%20_appsettingsModel%3B%0A%20%20%20%20%20%20%20%20%2F%2F%E8%8B%A5%E8%A6%81%E4%BD%BF%E7%94%A8%E7%83%AD%E6%9B%B4%E6%96%B0%EF%BC%8C%E5%88%99%E5%85%A5%E5%8F%82%E8%B0%83%E6%95%B4%E4%B8%BA%20IOptionsSnapshot%3CT%3E%0A%20%20%20%20%20%20%20%20public%20TestController(IOptions%3CAppsettingsModel%3E%20appsettingsModel)%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20_appsettingsModel%20%3D%20appsettingsModel.Value%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20public%20IActionResult%20Index()%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20View(%22Index%22%2C%20_appsettingsModel.Logging.LogLevel.Default)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%60%60%60%0A%0A-%20%E8%BF%99%E9%87%8C%E9%9C%80%E8%A6%81%E6%B3%A8%E6%84%8F%E4%B8%80%E7%82%B9%EF%BC%8CDI%E6%97%B6%EF%BC%8C%E5%A6%82%E6%9E%9C%E6%98%AF%E5%8D%95%E4%BE%8B%EF%BC%8C%E5%88%99%E6%97%A0%E6%B3%95%E4%BD%BF%E7%94%A8%E6%98%AFIOptionsSnapshot%EF%BC%8C%E4%BC%9A%E6%8A%A5%E9%94%99%E3%80%82%0A%0A%23%23%20%E5%A6%82%E4%BD%95%E8%A6%86%E5%86%99%E9%BB%98%E8%AE%A4%E8%A1%8C%E4%B8%BA%EF%BC%9F%E5%A6%82%E5%8F%96%E6%B6%88%E7%83%AD%E6%9B%B4%E6%96%B0%E6%94%AF%E6%8C%81%EF%BC%8C%E6%96%B9%E6%B3%95%E5%A6%82%E4%B8%8B%EF%BC%9A%0A%E5%81%87%E8%AE%BE%E6%B5%8B%E8%AF%95controller%E4%B8%BA%0A%0A%60%60%60csharp%0A%20%20%20%20public%20class%20TestController%20%3A%20Controller%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20private%20readonly%20AppsettingsModel%20_appsettingsModel%3B%0A%20%20%20%20%20%20%20%20%2F%2F%E4%BD%BF%E7%94%A8%E7%9A%84%E6%98%AF%EF%BC%9AIOptionsSnapshot%3CT%3E%0A%20%20%20%20%20%20%20%20public%20TestController(IOptionsSnapshot%3CAppsettingsModel%3E%20appsettingsModel)%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20_appsettingsModel%20%3D%20appsettingsModel.Value%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20public%20IActionResult%20Index()%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20View(%22Index%22%2C%20_appsettingsModel.Logging.LogLevel.Default)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%60%60%60%0A%0AProgram.cs%0A%0A%60%60%60csharp%0A%20%20%20%20public%20class%20Program%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20public%20static%20void%20Main(string%5B%5D%20args)%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20CreateWebHostBuilder(args).Build().Run()%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20public%20static%20IWebHostBuilder%20CreateWebHostBuilder(string%5B%5D%20args)%20%3D%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20WebHost.CreateDefaultBuilder(args)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.ConfigureAppConfiguration((context%2C%20config)%20%3D%3E%20%2F%2F1.%E9%80%9A%E8%BF%87%E8%AF%A5%E6%96%B9%E6%B3%95%E6%9D%A5%E8%A6%86%E7%9B%96%E9%85%8D%E7%BD%AE%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F2.%E9%87%8D%E6%96%B0%E6%B7%BB%E5%8A%A0json%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20config.AddJsonFile(%22appsettings.json%22%2C%20false%2C%20false)%3B%20%2F%2F3.%E6%9C%80%E5%90%8E%E4%B8%80%E4%B8%AA%E5%8F%82%E6%95%B0%E5%B0%B1%E6%98%AF%E6%98%AF%E5%90%A6%E7%83%AD%E6%9B%B4%E6%96%B0%E7%9A%84%E5%B8%83%E5%B0%94%E5%80%BC%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.UseStartup%3CStartup%3E()%3B%0A%20%20%20%20%7D%0A%60%60%60%0A%0A!%5B853140e9-c2ae-448b-9564-59e27023f387.png%5D(http%3A%2F%2Fpic.zhuliang.ltd%2F853140e9-c2ae-448b-9564-59e27023f387.png)%0A-%20%E8%BF%99%E4%B8%AA%E6%97%B6%E5%80%99%EF%BC%8C%E4%BA%BA%E4%B8%BA%E5%B0%86%E7%83%AD%E6%9B%B4%E6%96%B0%E7%BB%99%E5%85%B3%E9%97%AD%E4%BA%86%EF%BC%8C%E6%AD%A4%E6%97%B6%E6%9B%B4%E6%96%B0json%E6%96%87%E4%BB%B6%E5%90%8E%EF%BC%8C%E4%BF%AE%E6%94%B9%E5%90%8E%E7%9A%84%E5%86%85%E5%AE%B9%E4%B8%8D%E4%BC%9A%E6%9B%B4%E6%96%B0%E5%88%B0%E7%B3%BB%E7%BB%9F%E4%B8%AD%E3%80%82%0A%0A%23%20%E7%A4%BA%E4%BE%8B%EF%BC%9A%E6%8E%A7%E5%88%B6%E5%8F%B0%0A%3E%20%E5%AF%B9%E4%BA%8Econsole%E9%A1%B9%E7%9B%AE%EF%BC%8C%E9%BB%98%E8%AE%A4%E6%98%AF%E6%B2%A1%E6%9C%89%E8%BF%99%E4%B8%AAdll%E7%9A%84%EF%BC%8C%E9%9C%80%E8%A6%81%E8%87%AA%E8%A1%8C%E4%BB%8Enuget%E5%AE%89%E8%A3%85%0A%3E%20%0A%3E%20%E4%BB%8Enuget%E4%B8%AD%E5%AE%89%E8%A3%85%EF%BC%9AMicrosoft.AspNetCore.All%20%20%20%EF%BC%88%E6%B3%A8%E6%84%8F%EF%BC%8C%E6%9C%AB%E5%B0%BE%E4%B8%8D%E6%98%AFdll%EF%BC%8C%E8%80%8C%E6%98%AFall%EF%BC%89%0A%3E%20%0A%3E%20%E5%9C%A8%E9%A1%B9%E7%9B%AE%E4%B8%AD%E5%BC%95%E5%85%A5%EF%BC%9AMicrosoft.Extensions.Configuration%3B%20%E5%B9%B6%E4%BD%BF%E7%94%A8ConfigurationBuilder%E6%9D%A5%E6%9E%84%E5%BB%BA%E9%85%8D%E7%BD%AE%E3%80%82%0A%0A%0A%23%23%20%E4%BD%BF%E7%94%A8%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E5%8F%82%E6%95%B0%0A%E5%9C%A8%E6%8E%A7%E5%88%B6%E5%8F%B0%E9%A1%B9%E7%9B%AE%E5%B1%9E%E6%80%A7%E4%B8%AD%E5%A2%9E%E5%8A%A0name%E5%92%8Cclass%E5%8F%82%E6%95%B0%EF%BC%9A%0A%0A!%5Be4c2f50f-6d3d-4867-b12e-e2a3ede38da9.png%5D(http%3A%2F%2Fpic.zhuliang.ltd%2Fe4c2f50f-6d3d-4867-b12e-e2a3ede38da9.png)%0A%0A%E4%BD%BF%E7%94%A8%EF%BC%9A%0A%0A%60%60%60csharp%0Aclass%20Program%0A%7B%0A%20%20%20%20static%20void%20Main(string%5B%5D%20args)%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20var%20builder%20%3D%20new%20ConfigurationBuilder()%0A%20%20%20%20%20%20%20%20%20%20%20%20.AddCommandLine(args)%3B%0A%20%20%20%20%20%20%20%20var%20configuration%20%3D%20builder.Build()%3B%0A%0A%20%20%20%20%20%20%20%20Console.WriteLine(%24%22name%3A%7Bconfiguration%5B%22name%22%5D%7D%22)%3B%20%2F%2Fname%3ACLS%0A%20%20%20%20%20%20%20%20Console.WriteLine(%24%22class%3A%7Bconfiguration%5B%22class%22%5D%7D%22)%3B%20%20%20%2F%2Fclass%3AClass_A%0A%0A%20%20%20%20%20%20%20%20Console.Read()%3B%0A%20%20%20%20%7D%0A%7D%0A%60%60%60%0A%23%23%20%E4%BD%BF%E7%94%A8%E9%94%AE%E5%80%BC%E5%AF%B9%E6%9E%9A%E4%B8%BE%EF%BC%88%E8%BF%99%E9%87%8C%E4%BB%A5%E5%AD%97%E5%85%B8%E6%9D%A5%E8%AF%B4%E6%98%8E%EF%BC%89%0A%0A%60%60%60csharp%0A%20%20%20%20class%20Program%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20static%20void%20Main(string%5B%5D%20args)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20dict%20%3D%20new%20Dictionary%3Cstring%2C%20string%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%22name%22%2C%22MC%22%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%22class%22%2C%22CLASS_MC%22%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20builder%20%3D%20new%20ConfigurationBuilder()%0A%2F%2F%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.AddCommandLine(args)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.AddInMemoryCollection(dict)%3B%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20configuration%20%3D%20builder.Build()%3B%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Console.WriteLine(%24%22name%3A%7Bconfiguration%5B%22name%22%5D%7D%22)%3B%2F%2Fname%3AMC%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Console.WriteLine(%24%22class%3A%7Bconfiguration%5B%22class%22%5D%7D%22)%3B%20%20%2F%2Fclass%3ACLASS_MC%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Console.Read()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%60%60%60%0A%0A%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9%EF%BC%9A%0A-%20%E8%BF%99%E9%87%8C%E9%9C%80%E8%A6%81%E6%B3%A8%E6%84%8F%E4%B8%8B%EF%BC%8C%E8%99%BD%E7%84%B6%20AddCommandLine%20%E5%92%8C%20AddInMemoryCollection%20%E5%8F%AF%E4%BB%A5%E5%90%8C%E6%97%B6%E8%B0%83%E7%94%A8%EF%BC%8C%E4%BD%86%E4%B8%8D%E5%90%8C%E7%9A%84%E4%BD%BF%E7%94%A8%E6%AC%A1%E5%BA%8F%EF%BC%8C%E6%95%88%E6%9E%9C%E6%98%AF%E4%B8%8D%E4%B8%80%E6%A0%B7%E7%9A%84%EF%BC%88%E5%90%8E%E4%B8%80%E4%B8%AA%E4%BC%9A%E8%A6%86%E7%9B%96%E5%89%8D%E4%B8%80%E4%B8%AA%E7%9A%84%E5%86%85%E5%AE%B9---%E6%B5%85%E8%A6%86%E7%9B%96%EF%BC%89%EF%BC%8C%E5%A6%82%EF%BC%9A%0A%60%60%60csharp%0A%20%2F*%0A%20%20%20%20%E5%81%87%E8%AE%BE%20%E5%9C%A8%E9%A1%B9%E7%9B%AE%E5%B1%9E%E6%80%A7%E4%B8%AD%EF%BC%8C%E5%AE%9A%E4%B9%89%E7%9A%84%E5%86%85%E5%AE%B9%E4%B8%BA%EF%BC%9Aname%3DCLS%EF%BC%8Cclass%3DCLASS_CLS%EF%BC%8Cgrade%3D%22mygrade%22%0A%20%20%20%20%E5%9C%A8%E4%BB%A3%E7%A0%81%E4%B8%AD%EF%BC%8Cdict%E7%9A%84%E5%86%85%E5%AE%B9%E4%B8%BA%EF%BC%9Aname%3DMC%EF%BC%8Cclass%3DCLASS_MC%0A%20*%2F%0A%2F%2F%E5%AF%B9%E4%BA%8E%E4%BB%A3%E7%A0%81%EF%BC%9A%0Avar%20builder%20%3D%20new%20ConfigurationBuilder()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.AddCommandLine(args)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.AddInMemoryCollection(dict)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20configuration%20%3D%20builder.Build()%3B%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Console.WriteLine(%24%22name%3A%7Bconfiguration%5B%22name%22%5D%7D%22)%3B%2F%2Fname%3AMC%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Console.WriteLine(%24%22class%3A%7Bconfiguration%5B%22class%22%5D%7D%22)%3B%20%20%2F%2Fclass%3ACLASS_MC%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Console.WriteLine(%24%22grade%3A%7Bconfiguration%5B%22grade%22%5D%7D%22)%3B%20%20%2F%2Fgrade%3Amygrade%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%2F%2F%E5%AF%B9%E4%BA%8E%E4%BB%A3%E7%A0%81%EF%BC%9A%0Avar%20builder%20%3D%20new%20ConfigurationBuilder()%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.AddInMemoryCollection(dict)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.AddCommandLine(args)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20configuration%20%3D%20builder.Build()%3B%0A%20%20%20%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Console.WriteLine(%24%22name%3A%7Bconfiguration%5B%22name%22%5D%7D%22)%3B%2F%2Fname%3ACLS%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Console.WriteLine(%24%22class%3A%7Bconfiguration%5B%22class%22%5D%7D%22)%3B%20%20%2F%2Fclass%3ACLASS_CLS%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Console.WriteLine(%24%22grade%3A%7Bconfiguration%5B%22grade%22%5D%7D%22)%3B%20%20%2F%2Fgrade%3Amygrade%0A%0A%60%60%60%0A%0A-%20%E5%8F%A6%E5%A4%96%EF%BC%8C%E9%9C%80%E8%A6%81%E6%B3%A8%E6%84%8F%EF%BC%8C%E5%A6%82%E6%9E%9C%E7%94%A8dotnet%E5%91%BD%E4%BB%A4%E6%9D%A5%E6%89%A7%E8%A1%8CCommandLineSample.dll%EF%BC%8C%E9%82%A3%E4%B9%88%E2%80%9C%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E5%8F%82%E6%95%B0%E2%80%9D%E9%9C%80%E8%A6%81%E7%9B%B4%E6%8E%A5%E8%B7%9F%E5%9C%A8%E5%91%BD%E4%BB%A4%E7%9A%84%E5%90%8E%E9%9D%A2%EF%BC%8C%E5%A6%82%EF%BC%9A%0A%20%20%20%20-%20%E5%8F%A6%E5%A4%96%E5%A6%82%E6%9E%9CAddInMemoryCollection%E5%92%8CAddCommandLine%E5%90%8C%E6%97%B6%E4%BD%BF%E7%94%A8%EF%BC%8C%E9%82%A3%E4%B9%88%E9%9C%80%E8%A6%81%E5%B0%86AddCommandLine%E6%9C%80%E5%90%8E%E8%B0%83%E7%94%A8%EF%BC%8C%E5%90%A6%E5%88%99%E4%B8%80%E6%97%A6%E8%A2%AB%E8%A6%86%E7%9B%96%E4%BA%86%EF%BC%8C%E5%86%8D%E7%94%A8dotnet%E6%9D%A5%E8%B0%83%E7%94%A8%EF%BC%8C%E4%BC%9A%E6%B2%A1%E6%9C%89%E6%95%88%E6%9E%9C%E3%80%82%0A%60%60%60sh%0A%20dotnet%20%20%20CommandLineSample.dll%20%20%20name%3D111%20class%3D222%20%20grade%3D%22my%20grade%22%0A%60%60%60%0A%0A%23%23%20%E4%BD%BF%E7%94%A8JSON%E6%96%87%E4%BB%B6%0A-%20%E5%9C%A8%E9%A1%B9%E7%9B%AE%E6%A0%B9%E7%9B%AE%E5%BD%95%E5%88%9B%E5%BB%BA%E2%80%9Cjsconfig1.json%E2%80%9D%EF%BC%8C%E5%90%8C%E6%97%B6%E4%BF%AE%E6%94%B9%E8%AF%A5%E6%96%87%E4%BB%B6%E7%9A%84%E5%B1%9E%E6%80%A7%EF%BC%9A%0A%20%20%20%20-%20%E5%A4%8D%E5%88%B6%E5%88%B0%E8%BE%93%E5%87%BA%E7%9B%AE%E5%BD%95%EF%BC%9A%E5%A7%8B%E7%BB%88%E5%A4%8D%E5%88%B6%0A%20%20%20%20-%20%E7%94%9F%E6%88%90%E6%93%8D%E4%BD%9C%EF%BC%9A%E5%86%85%E5%AE%B9%0A%0AJSON%E6%96%87%E4%BB%B6%E5%86%85%E5%AE%B9%EF%BC%9A%0A%60%60%60json%0A%7B%0A%20%20%20%20%20%20%22Class%22%3A%20%22Class%20A%22%2C%0A%20%20%20%20%20%20%22PersonInfo%22%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22name%22%3A%20%22my%20name%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22age%22%3A%20%2212%22%0A%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%22Hobbies%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Type%22%3A%20%22Family%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22HobbyName%22%3A%20%22Piano%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Type%22%3A%20%22Personal%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22HobbyName%22%3A%20%22Singing%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%5D%0A%7D%0A%60%60%60%0A%0A%E4%BB%A3%E7%A0%81%EF%BC%9A%0A%0A%60%60%60csharp%0Astatic%20void%20Main(string%5B%5D%20args)%0A%7B%0A%20%20%20%20var%20builder%20%3D%20new%20ConfigurationBuilder()%0A%20%20%20%20%20%20%20%20.AddJsonFile(%22jsconfig1.json%22)%3B%0A%0A%20%20%20%20var%20configuration%20%3D%20builder.Build()%3B%0A%0A%20%20%20%20Console.WriteLine(%24%22name%3A%7Bconfiguration%5B%22PersonInfo%3Aname%22%5D%7D%22)%3B%0A%20%20%20%20Console.WriteLine(%24%22class%3A%7Bconfiguration%5B%22class%22%5D%7D%22)%3B%0A%20%20%20%20Console.WriteLine(%24%22age%3A%7Bconfiguration%5B%22PersonInfo%3Aage%22%5D%7D%22)%3B%0A%20%20%20%20%2F%2F%E6%B3%A8%E6%84%8F%E4%B8%8B%E8%B0%83%E7%94%A8%E5%8F%82%E6%95%B0%E6%97%B6%E7%9A%84%E6%A0%BC%E5%BC%8F%EF%BC%9A%22%7B%E5%8F%82%E6%95%B0Key%7D%3A%7B%E6%95%B0%E7%BB%84%E7%B4%A2%E5%BC%95%7D%3A%7B%E5%AD%90%E9%A1%B9%E5%8F%82%E6%95%B0Key%7D%22%0A%20%20%20%20Console.WriteLine(%24%22FamilyHobby%3A%7Bconfiguration%5B%22Hobbies%3A0%3AHobbyName%22%5D%7D%22)%3B%0A%20%20%20%20Console.WriteLine(%24%22PersonalHobby%3A%7Bconfiguration%5B%22Hobbies%3A1%3AHobbyName%22%5D%7D%22)%3B%0A%0A%20%20%20%20Console.Read()%3B%0A%7D%0A%60%60%60%0A%0A%23%20%E6%B3%A8%E5%86%8C%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E6%9F%90%E4%B8%80%E4%B8%AA%E6%AE%B5%E5%88%B0%E4%B8%80%E4%B8%AAclass%E6%A8%A1%E5%9E%8B%E4%B8%AD%0A%E5%BC%95%E7%94%A8%E4%B8%8A%E9%9D%A2%E7%9A%84json%EF%BC%9A%0A%0A%60%60%60json%0A%7B%0A%20%20%20%20%20%20%22Class%22%3A%20%22Class%20A%22%2C%0A%20%20%20%20%20%20%22PersonInfo%22%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22name%22%3A%20%22my%20name%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22age%22%3A%20%2212%22%0A%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%22Hobbies%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Type%22%3A%20%22Family%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22HobbyName%22%3A%20%22Piano%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Type%22%3A%20%22Personal%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22HobbyName%22%3A%20%22Singing%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%5D%0A%7D%0A%60%60%60%0A%E5%A6%82%E4%BD%95%E5%9C%A8%E6%B3%A8%E5%86%8C%E7%9A%84%E6%97%B6%E5%80%99%E5%B8%8C%E6%9C%9B%E5%B0%86PersonInfo%E8%BF%99%E4%B8%AAsection%E5%8D%95%E7%8B%AC%E6%B3%A8%E5%85%A5%E5%88%B0%20PersonInfo.cs%E7%B1%BB%E4%B8%AD%EF%BC%9F%EF%BC%88%E4%BB%A5mvc%E4%B8%BA%E4%BE%8B%EF%BC%89%0A%0A-%20PersonInfo.cs%0A%0A%60%60%60csharp%0Apublic%20class%20PersonInfo%0A%7B%0A%20%20%20%20public%20string%20Name%20%7Bget%3Bset%3B%7D%0A%20%20%20%20public%20int%20Age%7Bget%3Bset%3B%7D%0A%7D%0A%60%60%60%0A%0A-%20Startup.cs%0A%0A%60%60%60csharp%0A%0A%20%20%20%20%20%20%20%20public%20void%20ConfigureServices(IServiceCollection%20services)%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20services.Configure%3CCookiePolicyOptions%3E(options%20%3D%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20options.CheckConsentNeeded%20%3D%20context%20%3D%3E%20true%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20options.MinimumSameSitePolicy%20%3D%20SameSiteMode.None%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20%E4%BE%9D%E8%B5%96%E6%B3%A8%E5%85%A5%0A%20%20%20%20%20%20%20%20%20%20%20%20services.Configure%3CPersonInfo%3E(Configuration.GetSection(%22PersonInfo%22))%3B%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%60%60%60%0A%0A-%20%E5%9C%A8controller%E4%B8%AD%E4%BD%BF%E7%94%A8%EF%BC%9A%0A%0A%60%60%60csharp%0A%20%20%20%20public%20class%20TestController%20%3A%20Controller%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20private%20readonly%20PersonInfo%20%20%20_personInfo%3B%0A%20%20%20%20%20%20%20%20public%20TestController(IOptions%3CPersonInfo%3E%20personInfo)%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20_personInfo%20%3D%20_personInfo.Value%3B%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20public%20IActionResult%20Index()%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20View(%22Index%22%2C%20_personInfo.Name)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%60%60%60%0A%0A-%20%E5%9C%A8%20startup.cs%E4%B8%AD%E4%BD%BF%E7%94%A8%0A%60%60%60c%23%0A%2F%2Fjwt%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%20%0Aservices.Configure%3CJwtSettings%3E(Configuration.GetSection(%22JwtSettings%22))%3B%0A%0Avar%20jwtSettings%20%3D%20new%20JwtSettings()%3B%0AConfiguration.Bind(%22JwtSettings%22%2C%20jwtSettings)%3B%0Aservices.AddSanbenTechJwtService(jwtSettings.Issuer%2C%20jwtSettings.Audience)%3B%0A%60%60%60%0A%0A%23%20%E7%A4%BA%E4%BE%8B%EF%BC%9A%E5%9C%A8%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95%E4%B8%AD%E4%BD%BF%E7%94%A8%20%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%0A%E9%A6%96%E5%85%88%E7%A1%AE%E4%BF%9D%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E7%9A%84%E5%B1%9E%E6%80%A7%EF%BC%9A%0A%0A!%5B%5D(http%3A%2F%2Fpic.zhuliang.ltd%2F014585b6-5c84-4949-b073-5ad83387fc72.png)%0A%0Anuget%E5%AE%89%E8%A3%85%E3%80%81%E5%BC%95%E5%85%A5%E5%BF%85%E8%A6%81%E7%9A%84%E5%BA%93%EF%BC%9A%0A%60%60%60csharp%0AMicrosoft.Extensions.Configuration%0AMicrosoft.Extensions.Configuration.Binder%0AMicrosoft.Extensions.Configuration.Json%0A%60%60%60%0A%0A%E5%9C%A8%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0%E4%B8%AD%E4%BD%BF%E7%94%A8%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%EF%BC%9A%0A%0A%60%60%60csharp%0A%20%20%20%20%20%20%20%20public%20UnitTest1()%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20builder%20%3D%20new%20ConfigurationBuilder()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.AddJsonFile(%22appsettings.json%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20configuration%20%3D%20builder.Build()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20settings%20%3D%20configuration.GetSection(%22RedisSettings%22).Get%3CRedisSettings%3E()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20_mock.Setup(p%20%3D%3E%20p.Value).Returns(settings)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%60%60%60%0A%0A%23%20%E4%B8%80%E4%B8%AA%E5%AE%98%E6%96%B9%E4%BE%8B%E5%AD%90%0A%0A%3E%20https%3A%2F%2Fdocs.microsoft.com%2Fzh-cn%2Faspnet%2Fcore%2Fsecurity%2Fapp-secrets%3Fview%3Daspnetcore-2.2%26tabs%3Dwindows%0A%0A%60%60%60json%0A%7B%0A%20%20%22Movies%22%3A%20%7B%0A%20%20%20%20%22ServiceApiKey%22%3A%20%2212345%22%2C%0A%20%20%20%20%22ConnectionString%22%3A%20%22Server%3D(localdb)%5C%5Cmssqllocaldb%3BDatabase%3DMovie-1%3BTrusted_Connection%3DTrue%3BMultipleActiveResultSets%3Dtrue%22%0A%20%20%7D%0A%7D%0A%60%60%60%0A%E9%85%8D%E7%BD%AE%E6%A8%A1%E5%9E%8B%EF%BC%9A%0A%60%60%60csharp%0Apublic%20class%20MovieSettings%0A%7B%0A%20%20%20%20public%20string%20ConnectionString%20%7B%20get%3B%20set%3B%20%7D%0A%0A%20%20%20%20public%20string%20ServiceApiKey%20%7B%20get%3B%20set%3B%20%7D%0A%7D%0A%0A%2F%2F%E4%BD%BF%E7%94%A8%0Avar%20moviesConfig%20%3D%20Configuration.GetSection(%22Movies%22).Get%3CMovieSettings%3E()%3B%0A_moviesApiKey%20%3D%20moviesConfig.ServiceApiKey%3B%0A%60%60%60%0A%0A%23%20FAQ%0A1.%20%E5%9C%A8%E4%BD%BF%E7%94%A8AddJsonFile%E7%9A%84%E6%97%B6%E5%80%99%EF%BC%8C%E8%A2%AB%E6%B7%BB%E5%8A%A0%E7%9A%84json%E6%96%87%E4%BB%B6%E9%9C%80%E8%A6%81%E5%9C%A8%E9%A1%B9%E7%9B%AE%E6%89%80%E5%A4%84%E6%A0%B9%E7%9B%AE%E5%BD%95%E5%86%85%EF%BC%8C%E5%90%A6%E5%88%99%E4%B8%8D%E4%BC%9A%E5%8A%A0%E8%BD%BD%EF%BC%88%E8%B7%AF%E5%BE%84%E9%BB%98%E8%AE%A4%E6%98%AF%E5%88%B0%E9%A1%B9%E7%9B%AE%E6%96%87%E4%BB%B6%E5%A4%B9%EF%BC%8C%E8%80%8C%E9%9D%9Ebin%E7%9B%AE%E5%BD%95%E4%B8%8B%EF%BC%89%E3%80%82%E6%89%93%E5%8C%85%E5%8F%91%E5%B8%83%E5%90%8E%E4%BC%9A%E8%87%AA%E5%8A%A8%E4%BB%8E%E5%8F%91%E5%B8%83%E6%96%87%E4%BB%B6%E5%A4%B9%E6%89%BE%E5%AF%B9%E5%BA%94%E7%9A%84%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%0A%20%20%20%20-%20%E8%BF%99%E9%87%8C%E4%B8%BB%E8%A6%81%E6%98%AF%E4%B8%BA%E4%BA%86%E5%BA%94%E5%AF%B9%E6%96%B0%E5%BB%BA%E4%BA%86%E4%B8%80%E4%B8%AA%E9%A1%B9%E7%9B%AEA%EF%BC%8C%E7%84%B6%E5%90%8E%E5%9C%A8%E8%BF%99%E4%B8%AA%E9%A1%B9%E7%9B%AEA%E4%B8%AD%E6%B7%BB%E5%8A%A0%E4%BA%86%E4%B8%80%E4%B8%AA%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6config.json%EF%BC%8C%E9%A1%B9%E7%9B%AEB%E5%BC%95%E7%94%A8%E8%BF%99%E4%B8%AA%E9%A1%B9%E7%9B%AEA%E5%90%8E%EF%BC%8C%E8%99%BD%E7%84%B6%E6%9C%80%E7%BB%88%E7%BC%96%E8%AF%91%E4%B9%8B%E5%90%8E%E4%BC%9A%E5%9C%A8bin%E6%96%87%E4%BB%B6%E5%A4%B9%E5%86%85%E8%87%AA%E5%8A%A8%E7%94%9F%E6%88%90config.json%EF%BC%8C%E4%BD%86%E6%98%AF%E5%9C%A8%E8%B0%83%E8%AF%95%E6%A8%A1%E5%BC%8F%E4%B8%8B%EF%BC%8C%E9%BB%98%E8%AE%A4%E7%9A%84%E8%B7%AF%E5%BE%84%E6%98%AF%E5%9C%A8%E9%A1%B9%E7%9B%AE%E8%B7%AF%E5%BE%84%EF%BC%8C%E8%80%8C%E9%9D%9Ebin%E4%B8%8B%E7%9A%84%E6%96%87%E4%BB%B6%E5%A4%B9%E8%B7%AF%E5%BE%84%EF%BC%8C%E8%BF%99%E4%BC%9A%E5%AF%BC%E8%87%B4config.json%E5%9C%A8%E5%BC%80%E5%8F%91%E6%A8%A1%E5%BC%8F%E4%B8%8B%EF%BC%88%E8%B0%83%E8%AF%95%E6%97%B6%EF%BC%89%E4%B8%8D%E4%BC%9A%E8%A2%AB%E5%8A%A0%E8%BD%BD%E3%80%82%0A%20%20%20%20%20%20%20%20-%20%E5%8F%AF%E4%BB%A5%E6%89%8B%E5%8A%A8%E5%B0%86%E6%94%B9config.json%E6%96%87%E4%BB%B6%E5%A4%8D%E5%88%B6%E4%B8%80%E4%BB%BD%E5%88%B0%E9%A1%B9%E7%9B%AEB%E6%A0%B9%E7%9B%AE%E5%BD%95%E5%86%85%E3%80%82%0A%20%20%20%20%20%20%20%20-%20%E5%A6%82%E6%9E%9C%E6%98%AF%E7%94%A8nuget%E5%8F%91%E5%B8%83%E9%A1%B9%E7%9B%AEA%E5%90%8E%EF%BC%8C%E9%A1%B9%E7%9B%AEB%E5%86%8D%E4%BB%8Enuget%E5%AE%89%E8%A3%85%E9%A1%B9%E7%9B%AEA%EF%BC%8C%E5%88%99%E4%B8%8D%E4%BC%9A%E6%9C%89%E6%AD%A4%E9%97%AE%E9%A2%98%E3%80%82
  • 相关阅读:
    SDUT 2109 找女朋友
    Instant Complexity(模拟,递归)
    Lucky and Good Months by Gregorian Calendar(模拟)
    Wall(Graham算法)
    Beauty Contest(graham求凸包算法)
    A Round Peg in a Ground Hole(判断是否是凸包,点是否在凸包内,圆与多边形的关系)
    Pie(二分)
    Expanding Rods(二分)
    Fishnet(计算几何)
    Building a Space Station(kruskal,说好的数论呢)
  • 原文地址:https://www.cnblogs.com/deepthought/p/11297849.html
Copyright © 2011-2022 走看看