gpt4 book ai didi

c# - 添加具有多个实例但相同 IOptions 模型的服务的最佳方式

转载 作者:行者123 更新时间:2023-12-02 18:33:41 26 4
gpt4 key购买 nike

我已经实现了 IndexBuilderSettings,它是某些服务的模型,例如当我为其创建一个模型时,如下所示

services.AddSingleton<SearchBrandBuilder>()
.Configure<IndexBuilderSettings>((settings) =>
{
Configuration.GetSection("SearchBrandConfig").Bind(settings);
});

SearchBrandBuilder 正在使用 IOptions 构造

public class SearchBrandBuilder : SearchIndexBuilder<SearchBrandModel>
{
public SearchBrandBuilder(IOptions<IndexBuilderSettings> opts);
}

但问题是,当我必须创建另一个,例如具有相同 IOptions 构造函数的 SearchUnitBuilder 时,Configure() 似乎无济于事,因为它会由于其单例模式而被覆盖,请注意我想保留这样的设置 json

  "SearchBrandConfig": {
"AdminApiKey": "456",
"IndexName": "new-brands",
"SearchServiceName": "search_name"
},
"SearchUnitConfig": {
"AdminApiKey": "123",
"IndexName": "new-units",
"SearchServiceName": "search_name"
},

我也不想将库模型重写为 IOptionsSnapshot ,它将通过名称注入(inject)来区分。 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));

或者有任何常规的解决方案来处理这种情况吗?

最佳答案

您还可以将命名选项IOptionsSnapshot一起使用...我个人不是 super 粉丝,但它们在某些用例中很有用。 ́\_(ツ)_/́

给定

services.Configure<Config>("SomeConfig", Configuration.GetSection("SomeSection"));
services.Configure<Config>("AnotherConfig", Configuration.GetSection("AnotherSection"));

实现

public class SomeClass 
{
...

public SomeClass(IOptionsSnapshot<Config> namedOptionsAccessor)
{
_config1 = namedOptionsAccessor.Get("SomeConfig");
_config2 = namedOptionsAccessor.Get("AnotherConfig");
}

...

其他资源

关于c# - 添加具有多个实例但相同 IOptions 模型的服务的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69098001/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com