如何在.NET Core 2依赖注入中通过构造函数使用appsettings.json值?
我来给你几种可行的方案,根据你的场景选最合适的就行:
方案一:利用已注册的IOptions<MyOptions>在工厂方法中传递参数
首先确保你的MyOptions类和appsettings.json的配置结构对应,比如:
public class MyOptions { public string Arg1 { get; set; } public string Arg2 { get; set; } }
appsettings.json里的配置示例:
{ "MyOptions": { "Arg1": "从配置读取的第一个参数", "Arg2": "从配置读取的第二个参数" } }
你已经通过services.Configure<MyOptions>(Configuration.GetSection(nameof(MyOptions)));完成了配置注册,现在只需要在服务注册的工厂方法里,从服务提供者获取配置实例,再把值传给Service的构造函数:
services.AddTransient<IService, Service>(serviceProvider => { // 从DI容器中取出配置实例 var myOptions = serviceProvider.GetRequiredService<IOptions<MyOptions>>().Value; // 用配置值作为构造函数参数创建Service实例 return new Service(myOptions.Arg1, myOptions.Arg2); });
这种方法支持配置动态重载(如果后续需要,换成IOptionsSnapshot<MyOptions>即可),完全贴合DI容器的设计思路。
方案二:直接绑定配置到对象后传递参数
如果不想依赖IOptions,也可以直接把配置绑定到MyOptions实例,再传入构造函数:
// 先把配置绑定到MyOptions对象 var myOptions = new MyOptions(); Configuration.GetSection(nameof(MyOptions)).Bind(myOptions); // 注册服务时使用绑定好的配置值 services.AddTransient<IService, Service>(_ => new Service(myOptions.Arg1, myOptions.Arg2));
不过要注意,这种方式是一次性绑定的,后续修改配置文件不会自动更新myOptions的值,适合配置不会动态变化的场景。
方案三:修改Service构造函数,直接注入IOptions<MyOptions>
如果可以修改Service的代码,这是最推荐的方式,更符合依赖注入的最佳实践:
先修改Service的构造函数,让它接受IOptions<MyOptions>作为参数:
public class Service : IService { private readonly string _arg1; private readonly string _arg2; public Service(IOptions<MyOptions> options) { _arg1 = options.Value.Arg1; _arg2 = options.Value.Arg2; } // 你的服务方法实现 }
然后注册服务就能简化成:
services.AddTransient<IService, Service>();
这样DI容器会自动把IOptions<MyOptions>注入到Service的构造函数中,不需要手动处理参数传递,代码更简洁易维护。
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

