在.NET应用开发中,依赖注入能够有效降低组件间的耦合度,而JSON配置文件是存储应用运行参数的常用载体。将JSON配置和依赖注入结合,可以让配置参数更方便地传递到需要的服务中,提升代码的可维护性。

基础环境准备
首先创建一个.NET控制台应用或者ASP.NET Core应用,默认的项目模板已经包含了依赖注入和配置相关的基础包。如果是控制台应用,需要手动安装以下NuGet包:
- Microsoft.Extensions.DependencyInjection
- Microsoft.Extensions.Configuration
- Microsoft.Extensions.Configuration.Json
- Microsoft.Extensions.Options
读取JSON配置
首先需要在项目中添加一个JSON配置文件,比如命名为appsettings.json,内容如下:
{
"Database": {
"ConnectionString": "Server=localhost;Database=test;Uid=root;Pwd=123456;",
"Timeout": 30
},
"Api": {
"BaseUrl": "https://ipipp.com/api",
"RetryCount": 3
}
}
然后在代码中读取这个JSON配置,示例代码如下:
using Microsoft.Extensions.Configuration;
using System;
class Program
{
static void Main()
{
// 构建配置对象,读取appsettings.json
IConfiguration configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.Build();
// 读取配置参数
string dbConnection = configuration["Database:ConnectionString"];
int apiRetry = configuration.GetValue<int>("Api:RetryCount");
Console.WriteLine($"数据库链接字符串:{dbConnection}");
Console.WriteLine($"接口重试次数:{apiRetry}");
}
}
将配置绑定到选项类并注入
直接读取配置的方式在参数较多时不便于管理,更好的方式是使用选项模式,将JSON配置绑定到对应的类,再通过依赖注入获取配置实例。
定义选项类
首先定义和JSON配置结构对应的选项类:
public class DatabaseOptions
{
public const string SectionName = "Database";
public string ConnectionString { get; set; } = string.Empty;
public int Timeout { get; set; }
}
public class ApiOptions
{
public const string SectionName = "Api";
public string BaseUrl { get; set; } = string.Empty;
public int RetryCount { get; set; }
}
注册配置到依赖注入容器
在构建服务容器时,将配置和选项类绑定,并注册到IServiceCollection中:
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Options;
class Program
{
static void Main()
{
// 构建配置
IConfiguration configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.Build();
// 构建服务容器
IServiceProvider serviceProvider = new ServiceCollection()
// 注册DatabaseOptions,绑定Database配置段
.Configure<DatabaseOptions>(configuration.GetSection(DatabaseOptions.SectionName))
// 注册ApiOptions,绑定Api配置段
.Configure<ApiOptions>(configuration.GetSection(ApiOptions.SectionName))
// 注册使用配置的服务
.AddSingleton<IDatabaseService, DatabaseService>()
.AddTransient<IApiService, ApiService>()
.BuildServiceProvider();
// 获取服务并使用
var dbService = serviceProvider.GetRequiredService<IDatabaseService>();
dbService.PrintConnectionInfo();
var apiService = serviceProvider.GetRequiredService<IApiService>();
apiService.PrintApiInfo();
}
}
定义使用配置的服务
服务通过构造函数注入IOptions<T>来获取配置实例:
public interface IDatabaseService
{
void PrintConnectionInfo();
}
public class DatabaseService : IDatabaseService
{
private readonly DatabaseOptions _options;
// 构造函数注入IOptions<DatabaseOptions>
public DatabaseService(IOptions<DatabaseOptions> options)
{
_options = options.Value;
}
public void PrintConnectionInfo()
{
Console.WriteLine($"数据库链接:{_options.ConnectionString}");
Console.WriteLine($"数据库超时时间:{_options.Timeout}秒");
}
}
public interface IApiService
{
void PrintApiInfo();
}
public class ApiService : IApiService
{
private readonly ApiOptions _options;
// 构造函数注入IOptions<ApiOptions>
public ApiService(IOptions<ApiOptions> options)
{
_options = options.Value;
}
public void PrintApiInfo()
{
Console.WriteLine($"接口基础地址:{_options.BaseUrl}");
Console.WriteLine($"接口重试次数:{_options.RetryCount}");
}
}
不同生命周期的配置注入
依赖注入支持三种常见的生命周期,配置选项的注册也可以根据需求选择对应的生命周期:
| 生命周期 | 说明 | 适用场景 |
|---|---|---|
| Singleton | 整个应用生命周期内只有一个实例 | 配置参数不会频繁变更的场景 |
| Scoped | 同一个请求范围内只有一个实例 | ASP.NET Core请求相关的配置场景 |
| Transient | 每次获取都创建新实例 | 几乎不适用配置场景,除非配置需要每次重新读取 |
如果使用IOptionsSnapshot<T>代替IOptions<T>,可以在配置变更时获取到最新的配置值,适合需要支持配置热更新的场景:
public class HotUpdateService
{
private readonly IOptionsSnapshot<DatabaseOptions> _options;
public HotUpdateService(IOptionsSnapshot<DatabaseOptions> options)
{
_options = options;
}
public void PrintLatestConnection()
{
// 修改appsettings.json的Database:ConnectionString后,无需重启应用即可获取到新值
Console.WriteLine($"最新数据库链接:{_options.Value.ConnectionString}");
}
}
注意事项
- JSON配置文件的属性需要设置为“如果较新则复制”,否则运行时可能无法读取到配置文件
- 选项类的属性需要和JSON配置中的字段名称保持一致,否则无法正确绑定,也可以通过
[JsonPropertyName]特性指定映射关系 - 如果配置参数可能为空,需要在选项类中给属性设置默认值,避免空引用异常
- 不要直接在
Configure方法之外手动修改选项类的属性值,避免破坏依赖注入的一致性
依赖注入结合JSON配置的方式,让配置管理更规范,也符合.NET的依赖注入设计理念,在实际开发中建议优先使用选项模式来管理配置参数。
.NET依赖注入JSON配置IServiceCollection修改时间:2026-06-27 02:45:37