【发布时间】:2021-09-08 06:32:25
【问题描述】:
我已经实现了 IndexBuilderSettings,它是一些服务的模型,比如当我为它创建一个模型时,如下所示
services.AddSingleton<SearchBrandBuilder>()
.Configure<IndexBuilderSettings>((settings) =>
{
Configuration.GetSection("SearchBrandConfig").Bind(settings);
});
而SearchBrandBuilder 正在使用 IOptions 构造
public class SearchBrandBuilder : SearchIndexBuilder<SearchBrandModel>
{
public SearchBrandBuilder(IOptions<IndexBuilderSettings> opts);
}
但问题是当我必须创建另一个时,例如 SearchUnitBuilder 具有相同的 IOptions 构造函数,Configure() 似乎无济于事,因为它会由于其单例模式而被覆盖,请注意我会喜欢保持这样的设置json
"SearchBrandConfig": {
"AdminApiKey": "456",
"IndexName": "new-brands",
"SearchServiceName": "search_name"
},
"SearchUnitConfig": {
"AdminApiKey": "123",
"IndexName": "new-units",
"SearchServiceName": "search_name"
},
我也不想将库模型重写为 IOptionsSnapshot,它将通过名称注入来区分。 https://andrewlock.net/using-multiple-instances-of-strongly-typed-settings-with-named-options-in-net-core-2-x/
所以链接中的指南是这样的,但我不会喜欢
public void ConfigureServices(IServiceCollection services)
{
services.Configure<SlackApiSettings>("Dev", Configuration.GetSection("SlackApi:DevChannel"));
services.Configure<SlackApiSettings>("General", Configuration.GetSection("SlackApi:GeneralChannel"));
services.Configure<SlackApiSettings>("Public", Configuration.GetSection("SlackApi:PublicChannel"));
}
所以,我想在启动时临时使用配置,我发现可以通过下面的代码来完成,有点解决方法
services.AddSingleton<SearchBrandBuilder>(
new SearchBrandBuilder(Options.Create(Configuration.GetSection("SearchBrandConfig").Get<IndexBuilderSettings>())));
services.AddSingleton<SearchUnitBuilder>(
new SearchUnitBuilder(Options.Create(Configuration.GetSection("SearchUnitConfig").Get<IndexBuilderSettings>())));
我看到这是一个验收解决方案,但我想问是否有更好的解决方案?类似于内置函数的东西:
services.AddSingletonWithSetting<SearchUnitBuilder, IndexBuilderSettings>(settings =>
Configuration.GetSection("SearchUnitConfig").Bind(settings));
或者有任何常规的解决方案来处理这种情况?
【问题讨论】:
-
取决于具体情况,但如果个人有其他依赖项,我只会创建
Search{Type}Config的继承自IndexBuilderSettings并单独注册/注入它们。
标签: c# dependency-injection singleton