【发布时间】:2021-09-01 11:20:37
【问题描述】:
所以我有一个简单的配置类PubsubSettings:
public class PubSubSettings
{
public string ProjectId { get; set; }
public string TopicId { get; set; }
public int PartnerId { get; set; }
public string SubscriptionId { get; set; }
}
我以前只在我的 appsettings.json 中配置了其中一个,但现在我希望能够处理任意数量的它们。
我有另一个类PubSub,我通常会在其中注入一个IOptions<PubSubSettings>。而这反过来又被注入到我的Worker 类中。
services.Configure<PubSubSettings>(configuration.GetSection(nameof(PubSubSettings)));
...
services.AddHostedService<Worker>();
所以,我现在想要做的是为我的 AppSettings PubSubSettings 部分中的每个条目添加一个新的 Worker 作为托管服务,并将相关的 IOptions<PubSubSettings> 注入到每个条目中(以及标准 @ 987654330@)。
所以本质上,我想要这个配置块:
"PubsubSettings": [
{
"ProjectId": "project1",
"TopicId": "topic",
"PartnerId": 1,
"SubscriptionId": "sub1"
},
{
"ProjectId": "project2",
"TopicId": "topic2",
"PartnerId": 2,
"SubscriptionId": "sub2"
}
]
最终创建了两个托管服务,一个使用第一组选项,另一个使用第二组选项。
我看到一些问题正在寻找类似的东西,但我找不到与此完全一致的东西,所以我有点难过。有什么想法吗?
解决方案是 Dotnet 5。
【问题讨论】:
-
只需多次调用 AddHostedService 并指定您要使用的具体设置。所有 IHostedService 接口都将在您的应用完全启动之前被调用。
-
是的,这违背了从配置文件中提取它的意义,不是吗?除非我误解了你的意思
-
我的意思是为配置条目运行一个循环,例如 foreach(var ps in config.pses) 或者如果你希望它通过 DI 进行单元测试,创建 IHostedService,它聚合所有这些并做同样的事情。我会做第二种方法,因为我喜欢自己管理事情,但为简单起见,第一种方法就足够了。
标签: c# asp.net-core dependency-injection configuration