C# .NET控制台应用中如何获取用于依赖注入的IConfiguration
解决方法
第一步:注册IConfiguration到服务容器
你已经构建完成的IConfigurationRoot实例本身就实现了IConfiguration接口,无需额外转换,直接将其作为单例注册到服务集合即可满足DataRepo的依赖需求。
在ConfigureServices方法中,configurationRoot构建完成后添加如下代码:
serviceCollection.AddSingleton<IConfiguration>(configurationRoot);
第二步:补全其他缺失的依赖注册
你当前的服务注册还缺少两个依赖项,运行时会触发依赖注入解析失败,需要同步补充:
- 补充
ICodeGenManager的服务注册DataRepo构造函数还依赖ICodeGenManager接口,你需要替换为自己的实现类完成注册,示例如下:
// 将CodeGenManagerImpl替换为你项目中实际实现了ICodeGenManager的类 serviceCollection.AddScoped<ICodeGenManager, CodeGenManagerImpl>();
- 修复
AppSettings的注入问题
你当前通过serviceCollection.Configure<AppSettings>()注册的是IOptions<AppSettings>类型,而CodeGen构造函数直接注入AppSettings会无法解析,可二选一修复:
- 方案A:修改
CodeGen构造函数,注入IOptions<AppSettings>后读取配置值
public CodeGen(IDataRepo dataRepo, IOptions<AppSettings> options) { _dataRepo = dataRepo; _appSettings = options.Value; }
- 方案B:直接注册
AppSettings实例到容器
在configurationRoot构建完成后添加如下代码,替代原有的Configure<AppSettings>逻辑:
var appSettings = configurationRoot.GetSection("Configuration").Get<AppSettings>(); serviceCollection.AddSingleton(appSettings);
修改后的完整ConfigureServices示例
private static void ConfigureServices(IServiceCollection serviceCollection) { var configurationRoot = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appSettings.json", false) .Build(); // 注册IConfiguration满足DataRepo依赖 serviceCollection.AddSingleton<IConfiguration>(configurationRoot); serviceCollection.AddOptions(); // 若使用AppSettings直接注入的方案B,注释下面这行,替换为上面方案B的两行代码 serviceCollection.Configure<AppSettings>(configurationRoot.GetSection("Configuration")); // 补全ICodeGenManager注册,替换为实际实现类 serviceCollection.AddScoped<ICodeGenManager, CodeGenManagerImpl>(); // 原有业务服务注册 serviceCollection.AddScoped<IDataRepo, DataRepo>() .AddScoped<CodeGen>(); }
内容的提问来源于stack exchange,提问作者WillC
相关产品推荐
相关产品推荐

