如何获取注入到IConfigurationBuilder的命令行参数并实现依赖注入?
前提说明
Host.CreateDefaultBuilder(args) 方法已经默认内置了命令行配置源,你代码中额外调用的 c.AddCommandLine(args) 属于重复操作,可以直接删除。另外 AddCommandLine 的作用是将命令行参数解析为键值对存入配置系统,不会自动将原始 string[] 类型的参数数组注册到依赖注入容器。
1. 如何将 args 注入到 SomeHostedService 的构造函数?
根据你的需求(SomeHostedService 构造函数直接接收 string[] 类型参数),有两种成熟方案:
方案1:直接注册原始参数数组到容器
你定义的BuildHostContext方法本身已经接收了args参数,直接在ConfigureServices中将其注册为单例即可,容器会自动将其注入到SomeHostedService的构造函数中,无需修改现有类代码:public static IHost BuildHostContext(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureServices((context, services) => { // 注册原始命令行参数数组 services.AddSingleton<string[]>(args); services.AddHostedService<SomeHostedService>(); }).Build();这种方案适合容器中没有其他
string[]类型注册的场景,如果有多个string[]实例需要注册,推荐用方案2。方案2:用工厂方法注册
SomeHostedService
直接在注册服务时手动传入args,避免和其他string[]注册冲突:services.AddHostedService<SomeHostedService>(sp => new SomeHostedService(args));
2. 如何主动获取参数?
分两种场景处理:
- 需要获取原始的
string[]参数数组
按上述方法注册后,直接从服务提供者中获取即可,比如在入口点可以这么拿:using var host = HostBuilder.BuildHostContext(args); var originalArgs = host.Services.GetRequiredService<string[]>(); - 需要获取解析后的命令行键值对
直接注入IConfiguration实例即可读取,比如你命令行传入--files a.txt --files b.txt,可以这样读取数组:public class SomeHostedService { public SomeHostedService(IConfiguration config) { _files = config.GetSection("files").Get<string[]>(); } // 其余代码省略 }
如果你的命令行参数是无键的位置参数,从配置系统读取会比较麻烦,直接用原始args数组会更简单。
内容的提问来源于stack exchange,提问作者Tea
相关产品推荐
相关产品推荐

