ASP.NET Core和.NET控制台项目使用多配置类
我们可以在ASP.NET Core和.NET控制台项目中使用多个配置类,来读取同一个appsettings.json配置文件。
首先我们在ASP.NET Core项目和.NET控制台项目中创建两个配置类,FirstAppSettings和SecondAppSettings:
FirstAppSettings:
public class FirstAppSettings { public string? MobilePhone { get; set; } public int? Port { get; set; } public string? NoneProperty { get; set; } }
SecondAppSettings:
public class SecondAppSettings { public string? Profile { get; set; } public int? Port { get; set; } public string? NoneProperty { get; set; } }
然后我们在ASP.NET Core项目中,定义如下appsettings.json配置文件:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"AppSettings": {
"MobilePhone": "+8613XXXXXXX09",
"Port": 9090,
"Profile": "Production"
}
}
接下来在ASP.NET Core项目的Program类中,初始化配置文件节点AppSettings和FirstAppSettings类与SecondAppSettings类的映射关系:
using AspNetCore8Configuration.Models; namespace AspNetCore8Configuration { public class Program { public static void Main(string[] args) { var builder = WebApplication.CreateBuilder(args); // Add configuration files to the container. var env = builder.Environment; var configurationBuilder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)//这里采用appsettings.{env.EnvironmentName}.json根据当前的运行环境来加载相应的appsettings文件 .AddEnvironmentVariables(); builder.WebHost.UseConfiguration(configurationBuilder.Build()); builder.Services.Configure<FirstAppSettings>(builder.Configuration.GetSection("AppSettings"));//初始化配置文件节点AppSettings和FirstAppSettings类的映射关系 builder.Services.Configure<SecondAppSettings>(builder.Configuration.GetSection("AppSettings"));//初始化配置文件节点AppSettings和SecondAppSettings类的映射关系 // Add services to the container. builder.Services.AddControllersWithViews(); var app = builder.Build(); // Configure the HTTP request pipeline. if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Home/Error"); } app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.Run(); } } }
然后我们在ASP.NET Core项目的Controller构造函数中,就可以注入IOptions<FirstAppSettings>和IOptions<SecondAppSettings>接口的实例来读取到配置文件了:
using AspNetCore8Configuration.Models; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; using System.Diagnostics; namespace AspNetCore8Configuration.Controllers { public class HomeController : Controller { private readonly ILogger<HomeController> _logger; private readonly IOptions<FirstAppSettings> _optFirstAppSettings; private readonly IOptions<SecondAppSettings> _optSecondAppSettings; public HomeController(ILogger<HomeController> logger, IOptions<FirstAppSettings> optFirstAppSettings, IOptions<SecondAppSettings> optSecondAppSettings) { _logger = logger; _optFirstAppSettings = optFirstAppSettings; _optSecondAppSettings = optSecondAppSettings; } public IActionResult Index() { return View(); } public IActionResult Privacy() { return View(); } [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] public IActionResult Error() { return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier }); } } }
执行上面HomeController的Index方法,可以看到_optFirstAppSettings.Value和_optSecondAppSettings.Value的属性值如下:

可以看到FirstAppSettings类和SecondAppSettings类,都从配置文件appsettings.json中读取到了配置信息。
如果我们在配置文件appsettings.json中删除AppSettings节点,那么FirstAppSettings类和SecondAppSettings类读取不到任何属性值:

此外,我们也可以在ASP.NET Core项目的Program类中不初始化配置文件节点AppSettings和FirstAppSettings类与SecondAppSettings类的映射关系:
namespace AspNetCore8Configuration { public class Program { public static void Main(string[] args) { var builder = WebApplication.CreateBuilder(args); // Add configuration files to the container. var env = builder.Environment; var configurationBuilder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)//这里采用appsettings.{env.EnvironmentName}.json根据当前的运行环境来加载相应的appsettings文件 .AddEnvironmentVariables(); builder.WebHost.UseConfiguration(configurationBuilder.Build()); // Add services to the container. builder.Services.AddControllersWithViews(); var app = builder.Build(); // Configure the HTTP request pipeline. if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Home/Error"); } app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.Run(); } } }
然后在ASP.NET Core项目的Controller构造函数中,注入IConfiguration接口的实例,来读取appsettings.json配置文件的AppSettings节点,并映射到FirstAppSettings类和SecondAppSettings类:
using AspNetCore8Configuration.Models; using Microsoft.AspNetCore.Mvc; using System.Diagnostics; namespace AspNetCore8Configuration.Controllers { public class HomeController : Controller { private readonly ILogger<HomeController> _logger; private readonly FirstAppSettings? _firstAppSettings; private readonly SecondAppSettings? _secondAppSettings; public HomeController(ILogger<HomeController> logger, IConfiguration configRoot) { _logger = logger; _firstAppSettings = configRoot.GetSection("AppSettings").Get<FirstAppSettings>();//通过注入的IConfiguration接口实例configRoot,读取appsettings.json配置文件的AppSettings节点,并映射到FirstAppSettings类 _secondAppSettings = configRoot.GetSection("AppSettings").Get<SecondAppSettings>();//通过注入的IConfiguration接口实例configRoot,读取appsettings.json配置文件的AppSettings节点,并映射到SecondAppSettings类 } public IActionResult Index() { return View(); } public IActionResult Privacy() { return View(); } [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] public IActionResult Error() { return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier }); } } }
执行上面HomeController的Index方法,可以看到_firstAppSettings和_secondAppSettings的属性值如下:

可以看到FirstAppSettings类和SecondAppSettings类,都从配置文件appsettings.json中读取到了配置信息。
如果我们在配置文件appsettings.json中删除AppSettings节点,那么FirstAppSettings类和SecondAppSettings类都为null:

在.NET控制台项目中,为了访问appsettings.json配置文件,我们要先在项目中安装下面五个NuGet包:
Microsoft.Extensions.Configuration
Microsoft.Extensions.Configuration.Binder
Microsoft.Extensions.Configuration.FileExtensions
Microsoft.Extensions.Configuration.Json
Microsoft.Extensions.Configuration.EnvironmentVariables
然后我们在.NET控制台项目中,创建appsettings.json配置文件:
{
"AppSettings": {
"MobilePhone": "+8613XXXXXXX09",
"Port": 9090,
"Profile": "Production"
}
}
注意要将appsettings.json文件的属性做修改,将"Copy to Output Directory"选项设置为"Copy if newer",如下:


我们在.NET控制台项目的Program类Main方法中,构造一个IConfigurationRoot接口的实例configRoot,然后通过configRoot来读取appsettings.json配置文件的AppSettings节点,并映射到FirstAppSettings类和SecondAppSettings类,代码如下:
using Microsoft.Extensions.Configuration; namespace Net8Configuration { internal class Program { static void Main(string[] args) { FirstAppSettings? _firstAppSettings; SecondAppSettings? _secondAppSettings; var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddEnvironmentVariables(); IConfigurationRoot configRoot = builder.Build(); _firstAppSettings = configRoot.GetSection("AppSettings").Get<FirstAppSettings>();//通过IConfigurationRoot接口实例configRoot,读取appsettings.json配置文件的AppSettings节点,并映射到FirstAppSettings类 _secondAppSettings = configRoot.GetSection("AppSettings").Get<SecondAppSettings>();//通过IConfigurationRoot接口实例configRoot,读取appsettings.json配置文件的AppSettings节点,并映射到SecondAppSettings类 Console.WriteLine("Press any key to end..."); Console.ReadLine(); } } }
执行上面的代码,可以看到_firstAppSettings和_secondAppSettings的属性值如下:

可以看到FirstAppSettings类和SecondAppSettings类,都从配置文件appsettings.json中读取到了配置信息。
如果我们在配置文件appsettings.json中删除AppSettings节点,那么FirstAppSettings类和SecondAppSettings类都为null:

参考文献:
Configuration in ASP.NET Core
Options pattern in ASP.NET Core
浙公网安备 33010602011771号