如何在.NET的JSON配置中实现依赖注入

来源:Nodejs社区作者:关中王头衔:草根站长
导读:本期聚焦于小伙伴创作的《如何在.NET的JSON配置中实现依赖注入》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何在.NET的JSON配置中实现依赖注入》有用,将其分享出去将是对创作者最好的鼓励。

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

如何在.NET的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

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。