“IServiceCollection”不包含“配置”的定义,即使 IntelliSense 另有建议

Luk*_* Vo 14 .net c# configuration windows-services .net-6.0

我在这里遇到一个奇怪的问题。我创建了一个 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();
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,IntelliSense 似乎认识到( 的实例)Configuration中存在属性。servicesIServiceCollection

在此输入图像描述

但是,代码无法编译并出现以下错误:

“IServiceCollection”不包含“Configuration”的定义,并且找不到接受“IServiceCollection”类型的第一个参数的可访问扩展方法“Configuration”(您是否缺少 using 指令或程序集引用?)

我缺少什么包裹?我的项目目前有:

    <PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.0" />
    <PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.0" />
Run Code Online (Sandbox Code Playgroud)

Luk*_* Vo 22

似乎是一个 IntelliSense bug,我报告了它这里 在 VS 开发者社区 这里。如果您遇到同样的问题,请点赞。

看起来 IntelliSense 似乎被其他过载搞糊涂了。事实上,IServiceCollection没有Configuration属性,但HostBuilderContext有。

ConfigureServices有另一个公开两个参数的重载。这解决了问题:

    // Add ctx parameter
    .ConfigureServices((ctx, services) =>
    {
        var settings = new ScriptOptions();
        ctx.Configuration.Bind(settings);

        services.AddHostedService<WindowsBackgroundService>();
    })
Run Code Online (Sandbox Code Playgroud)


Cli*_*ein 17

只需安装 nuget 包“Microsoft.Extensions.Options.ConfigurationExtensions”即可解决问题,它具有“Configure”扩展方法。

  • 我已经安装了“Microsoft.Extensions.Options.ConfigurationExtensions”包,它工作正常,也许你有另一个解决方案,但我的是最简单的。 (2认同)