我这里遇到了一个奇怪的问题。我创建了一个 Worker 项目,以便按照此文档在 .NET 6 中创建 Windows 服务。我想从
appsettings.json
读取设置,所以我添加了以下代码:
IHost host = Host.CreateDefaultBuilder(args)
.UseWindowsService(options =>
{
options.ServiceName = "My Service";
})
.ConfigureServices(services =>
{
var settings = new ScriptOptions(); // ScriptOptions is just a POCO class
services.Configuration.Bind(settings);
services.AddHostedService<WindowsBackgroundService>();
})
.Build();
如您所见,IntelliSense 似乎认识到
Configuration
中存在 services
属性(IServiceCollection
的实例)。
但是,代码无法编译并出现此错误:
“IServiceCollection”不包含“Configuration”的定义,并且找不到接受“IServiceCollection”类型的第一个参数的可访问扩展方法“Configuration”(您是否缺少 using 指令或程序集引用?)
我缺少什么包裹?我的项目目前有:
<PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.0" />
似乎是一个 IntelliSense 错误,我在 VS 开发者社区报告了它。如果您遇到同样的问题,请点赞
看起来 IntelliSense 似乎因其他过载而感到困惑。事实上 IServiceCollection 没有
Configuration
属性,但 HostBuilderContext 有。
ConfigureServices
还有另一个公开两个参数的重载。这解决了问题:
// Add ctx parameter
.ConfigureServices((ctx, services) =>
{
var settings = new ScriptOptions();
ctx.Configuration.Bind(settings);
services.AddHostedService<WindowsBackgroundService>();
})
只需安装nuget包“Microsoft.Extensions.Options.ConfigurationExtensions” 它会解决问题,它有“配置”扩展方法。
添加“Microsoft.Extensions.Options.ConfigurationExtensions”包。
在程序类中添加获取secret.json:
var configuration = new ConfigurationBuilder().AddUserSecrets<Program>().Build();
或获取appsetting.json
var configuration = new ConfigurationBuilder().AddJsonFile(appsettings.json, optional: true, reloadOnChange: true).Build();
获取你的秘密:
configuration["ServiceBus:CONNECTION_STRING"];