示例: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