在 .NET Core 生态系统中,利用 JSON 文件进行配置管理可提高灵活性和易维护性。
本文将引导你完成一种全面的方法,将 JSON 设置反序列化为 C# 类对象,使用具有依赖项注入的接口访问这些设置,并将配置数据封装在数据传输对象 (DTO) 中,以便进行干净高效的访问。IConfiguration
在 .NET Core 中取消 JSON 设置,图片来源:由作者创建
我们将用一个实际的例子来说明这些概念。
第一步涉及设置一个 JSON 文件来保存应用程序的配置设置。
为了演示,我们按照 .NET Core 约定将此文件命名为 。appsettings.json
{
"ApplicationSettings": {
"AppName": "MyDotNetApp",
"Version": "1.0.0",
"Environment": "Development",
"FeatureToggles": {
"EnableFeatureX": true,
"EnableFeatureY": false
}
}
}
此 JSON 结构表示一组简单的配置,包括应用程序名称、版本、环境和功能切换。
为了将 JSON 设置反序列化为 C# 对象,我们定义了镜像 JSON 结构的 POCO(普通旧 CLR 对象)类。
public class ApplicationSettings
{
public string AppName { get; set; }
public string Version { get; set; }
public string Environment { get; set; }
public FeatureToggles FeatureToggles { get; set; }
}
public class FeatureToggles
{
public bool EnableFeatureX { get; set; }
public bool EnableFeatureY { get; set; }
}
这些类提供了与 JSON 配置的直接映射,便于轻松反序列化。
.NET Core 的内置依赖项注入框架对于实现分离且易于测试的代码至关重要。为了用于访问我们的 JSON 设置,我们在应用程序启动中对其进行配置。IConfiguration
Startup.cs(ConfigureServices 方法):
public void ConfigureServices(IServiceCollection services)
{
// Configure binding to the ApplicationSettings section of appsettings.json
var appSettingsSection = Configuration.GetSection("ApplicationSettings");
services.Configure<ApplicationSettings>(appSettingsSection);
// Other services
}
数据传输对象 (DTO) 可用于在层之间封装和传输数据。我们将创建一个类,以便轻松访问我们的配置设置。SettingsDto
public class SettingsDto
{
private readonly ApplicationSettings _appSettings;
public SettingsDto(IOptions<ApplicationSettings> appSettings)
{
_appSettings = appSettings.Value;
}
// Properties for direct access
public string AppName => _appSettings.AppName;
public string Version => _appSettings.Version;
public string Environment => _appSettings.Environment;
public bool FeatureXEnabled => _appSettings.FeatureToggles.EnableFeatureX;
public bool FeatureYEnabled => _appSettings.FeatureToggles.EnableFeatureY;
}
要通过依赖项注入提供,请在SettingsDtoConfigureServicesStartup.cs.
services.AddTransient<SettingsDto>();
设置完成后,访问我们的应用程序设置变得简单明了。下面是一个演示其用法的示例控制器:SettingsDto
SampleController.cs
[ApiController]
[Route("[controller]")]
public class SampleController : ControllerBase
{
private readonly SettingsDto _settingsDto;
public SampleController(SettingsDto settingsDto)
{
_settingsDto = settingsDto;
}
[HttpGet]
public IActionResult GetSettings()
{
return Ok(new
{
AppName = _settingsDto.AppName,
Version = _settingsDto.Version,
Environment = _settingsDto.Environment,
FeatureXEnabled = _settingsDto.FeatureXEnabled,
FeatureYEnabled = _settingsDto.FeatureYEnabled
});
}
}
通过注入到我们的控制器中,我们可以轻松地将所需的设置作为属性访问,使控制器操作简洁明了。SettingsDto
通过采用这种方法,我们可以享受一种更干净、更有条理和可维护的方式来处理配置设置,从而增强其应用程序的整体架构和设计。