1. 控制台應用
新建一個控制台應用,添加兩個Package:
Install-Package Microsoft.Extensions.Configuration Install-Package Microsoft.Extensions.Configuration.Json
1.1 單個配置文件
創建配置文件appsettings.json:
{
"Data": "10000",
"ConnectionStrings": {
"DevContext": "開發庫",
"ProdContext": "生產庫"
}
}
讀取配置文件:
using System; using System.IO; using Microsoft.Extensions.Configuration; namespace Libing.Core.ConsoleApp { class Program { static void Main(string[] args) { var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json"); var config = builder.Build(); Console.WriteLine(config["Data"]); // 配置鍵 Console.WriteLine(config.GetSection("ConnectionStrings:DevContext").Value); // 分層鍵 } } }
通過ConfigurationBuilder對象來創建ConfigurationRoot對象,進行讀取配置文件。
SetBasePath:設置配置文件基礎路徑
AddJsonFile:添加讀取的Json文件
var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json");
配置文件可選及修改自動加載設置:
var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json");
配置鍵約定:
(1)鍵不區分大小寫。 例如,ConnectionString 和 connectionstring 被視為等效鍵。
(2)分層鍵使用冒號分隔符 (:)
1.2 多個配置文件
AddJsonFile:添加多個配置文件。
var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json") .AddJsonFile("appsettings.Development.json", optional: true, reloadOnChange: true);
{
"Data": "10000",
"ConnectionStrings": {
"DefaultContext": "默認庫"
}
}
{
"Data": "10000",
"ConnectionStrings": {
"DefaultContext": "開發庫"
}
}
using System; using System.IO; using Microsoft.Extensions.Configuration; namespace Libing.Core.ConsoleApp { class Program { static void Main(string[] args) { var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json") .AddJsonFile("appsettings.Development.json"); var config = builder.Build(); Console.WriteLine(config.GetConnectionString("DefaultContext")); // 輸出:開發庫 } } }
using System; using System.IO; using Microsoft.Extensions.Configuration; namespace Libing.Core.ConsoleApp { class Program { static void Main(string[] args) { var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.Development.json") .AddJsonFile("appsettings.json"); var config = builder.Build(); Console.WriteLine(config.GetConnectionString("DefaultContext")); // 輸出:默認庫 } } }
配置鍵相同時,讀取選擇最后一個添加的文件(AddJsonFile)。
若要讀取所有添加文件的配置信息,可遍歷ConfigurationRoot的Providers屬性。
using System; using System.IO; using Microsoft.Extensions.Configuration; namespace Libing.Core.ConsoleApp { class Program { static void Main(string[] args) { var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json") .AddJsonFile("appsettings.Development.json"); var config = builder.Build(); foreach (var provider in config.Providers) { provider.TryGet("ConnectionStrings:DefaultContext", out string defaultContext); Console.WriteLine(defaultContext); } // 輸出:默認庫 // 開發庫 } } }
1.3 配置讀取綁定
(1)Key讀取(鍵值對)
{
"AppID": 10000,
"Node": {
"ID": "1",
"Text": "節點"
}
}
var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json"); var config = builder.Build(); var appID = config["AppID"];
var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json"); var config = builder.Build(); var nodeid = config.GetSection("Node").GetSection("ID").Value;
(2)綁定簡單數據類型 GetValue<T>
添加Package:Microsoft.Extensions.Configuration.Binder
using System; using System.IO; using Microsoft.Extensions.Configuration; namespace Libing.Core.ConsoleApp { class Program { static void Main(string[] args) { var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json"); var config = builder.Build(); var appID = config.GetValue<int>("AppID"); Console.WriteLine(appID); } } }
(3)綁定到類對象 Get<T>
using System; using System.Collections.Generic; using System.Text; namespace Libing.Core.ConsoleApp { public class Node { public int ID { get; set; } public string Text { get; set; } } }
using System; using System.IO; using Microsoft.Extensions.Configuration; namespace Libing.Core.ConsoleApp { class Program { static void Main(string[] args) { var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json"); var config = builder.Build(); var node = config.GetSection("Node").Get<Node>(); Console.WriteLine("{0}-{1}", node.ID, node.Text); } } }
(4)綁定集合對象
{
"Node": {
"ID": 1,
"Text": "節點",
"Children": [
{
"ID": 11,
"Text": "子節點1"
},
{
"ID": 12,
"Text": "子節點2"
},
{
"ID": 13,
"Text": "子節點3"
}
]
}
}
using System; using System.Collections.Generic; using System.IO; using Microsoft.Extensions.Configuration; namespace Libing.Core.ConsoleApp { class Program { static void Main(string[] args) { var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile(cfg => { cfg.Path = "appsettings.json"; cfg.Optional = false; cfg.ReloadOnChange = true; }); var config = builder.Build(); var children = config.GetSection("Node:Children").Get<IEnumerable<Node>>(); foreach (var child in children) { Console.WriteLine("{0}-{1}", child.ID, child.Text); } } } }
2. API應用程序
新建API應用程序,在根目錄下自動創建的Program.cs:
public class Program { public static void Main(string[] args) { CreateWebHostBuilder(args).Build().Run(); } public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>(); }
其中,CreateDefaultBuilder創建默認配置,包括:
(1)加載IConfiguration配置,讀取文件appsettings.json;
(2)加載IConfiguration配置,讀取文件appsettings.[EnvironmentName].json;
(3)......
2.1 ConfigureServices中鍵值讀取
在根目錄下文件Startup.cs中ConfigureServices()中采用鍵值對方式讀取:
public void ConfigureServices(IServiceCollection services) { services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); int appid = Configuration.GetValue<int>("AppID"); var nodes = Configuration.GetSection("Node:Children").Get<IEnumerable<Node>>(); }
2.2 ConfigureServices中使用Options
添加安裝包:Microsoft.Extensions.Options.ConfigurationExtensions
{
"Node": {
"ID": 1,
"Text": "NodeText"
}
}
public void ConfigureServices(IServiceCollection services) { services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); services.AddOptions(); services.Configure<Node>(Configuration.GetSection("Node")); }
在控制器中,通過構造函數注入,讀取配置。
public class LogController : ControllerBase { private Node node; public LogController(IOptions<Node> option) { node = option.Value; } [HttpGet] public Node Get() { int id = node.ID; string text = node.Text; return node; } }
2.3 讀取自定義配置文件
在項目根目錄下,新建配置文件 config.json:
{
"AppID": "10000"
}
修改Program.js,增加讀取config.json文件。
public class Program { public static void Main(string[] args) { CreateWebHostBuilder(args).Build().Run(); } public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .ConfigureAppConfiguration((hostingContext, config) => { config.SetBasePath(Directory.GetCurrentDirectory()); config.AddJsonFile("config.json", optional: true, reloadOnChange: true); }) .UseStartup<Startup>(); }
在Startup.cs中調用:
public void ConfigureServices(IServiceCollection services) { // 省略其它代碼... string appid = Configuration.GetSection("AppID").Value; }
2.4 獨立類中讀取配置
在.Net Framework中,ConfigurationManager類用於讀取配置文件。但在.Net Core中沒有該類,新建類ConfigurationManager用於讀取配置文件。
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.IO; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; namespace Libing.Portal.Core.Api.Common.Configs { public static class ConfigurationManager { public readonly static IConfiguration Configuration; static ConfigurationManager() { Configuration = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .Build(); } public static T GetSection<T>(string key) where T : class, new() { return new ServiceCollection() .AddOptions() .Configure<T>(Configuration.GetSection(key)) .BuildServiceProvider() .GetService<IOptions<T>>() .Value; } public static string GetSection(string key) { return Configuration.GetValue<string>(key); } } }
