首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Options Builder的选项模式

使用Options Builder的选项模式
EN

Stack Overflow用户
提问于 2022-05-03 17:01:41
回答 1查看 663关注 0票数 0

我试图了解.Net依赖注入是如何从OptionsBuilder<TOptions>解析IOption<TOption>的,并且在.Net的文档和API中找不到一些东西。它是如何与OptionsBuilder相关的。例如,考虑这一行:

代码语言:javascript
复制
new OptionsBuilder<Settings>(builder.Services, String.Empty)
.Bind(builder.Configuration.GetSection("settings"));

我创建了一个选项生成器实例,并将其配置为绑定到IConfiguration部分。然后,在我的一个控制器中,我注入了IOptions<settings>,它按我的意愿解决了。错过的链接在哪里?我在Microsoft.Extensions.Options名称空间中找不到options与Options或Options类型之间的任何链接,因此它应该是DI I内容的内部链接。既然.Net现在是开源的,那么链接在哪里呢?在实现时,所有的代码都在GitHub中。谢谢

EN

回答 1

Stack Overflow用户

发布于 2022-05-03 17:30:15

根据AddOptions的代码,我们对这个扩展方法进行了以下注册:

代码语言:javascript
复制
public static IServiceCollection AddOptions(this IServiceCollection services)
{
    ThrowHelper.ThrowIfNull(services);

    services.TryAdd(ServiceDescriptor.Singleton(typeof(IOptions<>), typeof(UnnamedOptionsManager<>)));
    services.TryAdd(ServiceDescriptor.Scoped(typeof(IOptionsSnapshot<>), typeof(OptionsManager<>)));
    services.TryAdd(ServiceDescriptor.Singleton(typeof(IOptionsMonitor<>), typeof(OptionsMonitor<>)));
    services.TryAdd(ServiceDescriptor.Transient(typeof(IOptionsFactory<>), typeof(OptionsFactory<>)));
    services.TryAdd(ServiceDescriptor.Singleton(typeof(IOptionsMonitorCache<>), typeof(OptionsCache<>)));
    return services;
}

所以当我们注入IOtion<TOption>时,它尝试注入它的一个实例,即UnnamedOptionManager<TOption>。为了创建它的一个实例,它的构造函数要求将OptionsFactory注入到它,而OptionFactory本身的构造函数需要注入所有的Configuration和Post操作以及验证。这都是必需的。所以剩下的就是我们如何注册IConfigureOptions。可以使用Options和服务集合的Configure/PostConfigure/Validate/ConfigureOptions扩展方法进行以下操作: 1-使用Options :在这种方法中,我们使用它的构造函数创建一个选项生成器,它需要服务集合和选项名(或者使用返回选项生成器的service.AddOptions<TOptions>()扩展方法)。然后,我们使用配置、PostConfigure和验证或绑定方法以链式方式配置这个选项生成器(这些方法不同于将服务集合定义为扩展方法的方法(配置、PostConfigure、ConfigureOptions、ConfigureAll、PostConfigureAll) )。OptionsBuilder的每一种方法都在内部执行此操作:service.AddTransient<IConfigureOptions>()和调用AddOptions()。2-使用为服务容器(ConfigurePostConfigureConfigureOptionsConfigureAllPostConfigureAll)定义的扩展方法,几乎如下所示: //配置服务集合的扩展方法

代码语言:javascript
复制
public static IServiceCollection Configure<TOptions>(this IServiceCollection services, string? name, Action<TOptions> configureOptions)
    where TOptions : class
{
    ThrowHelper.ThrowIfNull(services);
    ThrowHelper.ThrowIfNull(configureOptions);
    services.AddOptions();
    services.AddSingleton<IConfigureOptions<TOptions>>(new ConfigureNamedOptions<TOptions>(name, configureOptions));
    return services;
}

所以这个问题的答案是AddOptions()的定义和OptionsBuilder的每一种方法的定义。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72102940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档