示例:ASP.NET MVC asp.net mvc已經內部實現了對配置appsettings.json文件的使用,builder預設支持熱更新。 使用示例: 假設appsettings.json內容為: { "Logging": { "LogLevel": { "Default": "Warnin ...
示例: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:
- 在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為例)
public class PersonInfo
{
public string Name {get;set;}
public int Age{get;set;}
}
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);
}
public class TestController : Controller
{
private readonly PersonInfo _personInfo;
public TestController(IOptions<PersonInfo> personInfo)
{
_personInfo = _personInfo.Value;
}
public IActionResult Index()
{
return View("Index", _personInfo.Name);
}
}
//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,則不會有此問題。
%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%