• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
PowerCoder
博客园    首页    新随笔    联系   管理    订阅  订阅

ASP.NET Core和.NET控制台项目使用多配置类

我们可以在ASP.NET Core和.NET控制台项目中使用多个配置类,来读取同一个appsettings.json配置文件。

配置类
ASP.NET Core项目
.NET控制台项目

 

配置类

首先我们在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项目

然后我们在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控制台项目

在.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

 

posted @ 2025-06-25 11:23  PowerCoder  阅读(44)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3