我试图了解.Net依赖注入是如何从OptionsBuilder<TOptions>解析IOption<TOption>的,并且在.Net的文档和API中找不到一些东西。它是如何与OptionsBuilder相关的。例如,考虑这一行:
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中。谢谢
发布于 2022-05-03 17:30:15
根据AddOptions的代码,我们对这个扩展方法进行了以下注册:
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-使用为服务容器(Configure、PostConfigure、ConfigureOptions、ConfigureAll、PostConfigureAll)定义的扩展方法,几乎如下所示: //配置服务集合的扩展方法
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的每一种方法的定义。
https://stackoverflow.com/questions/72102940
复制相似问题