C# 可注入应用程序配置服务

C# 可注入应用程序配置服务,c#,asp.net-core-webapi,C#,Asp.net Core Webapi,我想要一个可以注入的服务,或者在我的示例中使用GetService,它包含我的appsettings.json文件中的设置 appsettings.json片段如下所示: "ExternalInterfaces": [ { "Name": "name1", "BaseUrl": "https://www.baseurl1.svc" }, { "Name": "name2", "BaseUrl"

我想要一个可以注入的服务,或者在我的示例中使用
GetService
,它包含我的
appsettings.json
文件中的设置

appsettings.json
片段如下所示:

  "ExternalInterfaces": [
      {
        "Name": "name1",
        "BaseUrl": "https://www.baseurl1.svc"
      },
      {
        "Name": "name2",
        "BaseUrl": "https://www.baseurl2.svc"
      }
    ]
为此,我有以下接口:

using System.Collections.Generic;

namespace Infrastructure.Settings
{
    public interface IExternalInterfaceSettingsCollection
    {
        IReadOnlyCollection<IExternalInterfaceSettings> Settings { get; set; }
    }
}

namespace Infrastructure.Settings
{
    public interface IExternalInterfaceSettings
    {
        string Name { get; set; }
        string BaseUrl { get; set; }
    }
}
然后将其消耗如下:

var externalInterfaceConfiguration = app.ApplicationServices.GetService<ExternalInterfaceSettingsCollection>();
var Setting1BaseUrl = externalInterfaceConfiguration.Settings
    .SingleOrDefault(s => s.Name == "name1")?.BaseUrl;
var externalInterfaceConfiguration=app.ApplicationServices.GetService();
var Setting1BaseUrl=externalInterfaceConfiguration.Settings
.SingleOrDefault(s=>s.Name==“name1”)?.BaseUrl;
但是,在最后3行中,
externalInterfaceConfiguration
始终为空


很明显我遗漏了什么,但我看不出是什么。有什么线索吗?

您已经注册了
IExternalInterfaceSettings
,但正在尝试检索
ExternalInterfaceSettings
。集合中没有此类服务,因此结果为空(因为您使用了
GetService
)。如果您使用了
GetRequiredService
,那么就会抛出一个异常,告诉您同样的情况

然后,选项模式并不意味着绑定到接口。整个想法是绑定到表示一组特定设置的POCO。如果您想使用一个接口,我想这是您的特权,但它不适用于选项配置。换句话说,您需要以下内容:

services.Configure<ExternalInterfaceSettings>(Configuration.GetSection("ExternalInterfaces"));

如果有助于启动,请不要拒绝:services.AddOptions().Configure(_configuration.GetSection(“QiWisetings”);注入构造函数:publicsmth(IOptions-options){var-test=options.Value.MySetting;}我认为您是对的。现在就离开办公室,但我明天试试这个。
var externalInterfaceConfiguration = app.ApplicationServices.GetService<ExternalInterfaceSettingsCollection>();
var Setting1BaseUrl = externalInterfaceConfiguration.Settings
    .SingleOrDefault(s => s.Name == "name1")?.BaseUrl;
services.Configure<ExternalInterfaceSettings>(Configuration.GetSection("ExternalInterfaces"));
services.AddScoped<IExternalInterfaceSettings, ExternalInterfaceSettings>(p =>
    p.GetRequiredService<IOptions<ExternalInterfaceSettings>>().Value);