示例:asp.net mvc
asp.net mvc已经内部实现了对配置appsettings.json文件的使用,builder默认支持热更新。
使用示例:
假设appsettings.json内容为:
{ "logging": { "loglevel": { "default": "warning" } }, "allowedhosts": "*" }
- 新建一个跟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必须是公共的,不能是私有。
另外对于该模型,必须要有一个无参构造函数。
- 在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); }
- 在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
- 在使用addjsonfile的时候,被添加的json文件需要在项目所处根目录内,否则不会加载(路径默认是到项目文件夹,而非bin目录下)。打包发布后会自动从发布文件夹找对应的配置文件
- 这里主要是为了应对新建了一个项目a,然后在这个项目a中添加了一个配置文件config.json,项目b引用这个项目a后,虽然最终编译之后会在bin文件夹内自动生成config.json,但是在调试模式下,默认的路径是在项目路径,而非bin下的文件夹路径,这会导致config.json在开发模式下(调试时)不会被加载。
- 可以手动将改config.json文件复制一份到项目b根目录内。
- 如果是用nuget发布项目a后,项目b再从nuget安装项目a,则不会有此问题。
- 这里主要是为了应对新建了一个项目a,然后在这个项目a中添加了一个配置文件config.json,项目b引用这个项目a后,虽然最终编译之后会在bin文件夹内自动生成config.json,但是在调试模式下,默认的路径是在项目路径,而非bin下的文件夹路径,这会导致config.json在开发模式下(调试时)不会被加载。
%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