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);