【问题标题】:Options Pattern using Options Builder使用选项生成器的选项模式
【发布时间】:2022-07-18 22:21:50
【问题描述】:

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

new OptionsBuilder<Settings>(builder.Services, String.Empty)
.Bind(builder.Configuration.GetSection("settings"));

我创建了一个选项生成器实例并将其配置为绑定到IConfiguration 部分。 然后在我的一个控制器中,我注入了IOptions&lt;settings&gt;,它按照我的意愿解决了。错过的链接在哪里?我在 Microsoft.Extensions.Options 命名空间中找不到 options Builder 和 Options Factory 或 Options Manager 类型之间的任何链接,所以它应该是 DI I 事物内部的东西。该链接在哪里,因为 .Net 现在是开源的,并且所有代码都在 GitHub 中,因为它已实现。 谢谢

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    根据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&lt;TOption&gt; 时,它会尝试注入它的一个实例UnnamedOptionManager&lt;TOption&gt;。并且要创建它的实例,它的构造函数需要注入OptionsFactoryOptionFactory 的构造函数本身需要注入所有配置操作和配置后操作和验证。这都是需要的。所以剩下的就是我们如何注册IConfigureOptions。可以通过以下方式使用 Options Builder 和使用服务集合的Configure/PostConfigure/Validate/ConfigureOptions 扩展方法: 1- 使用选项生成器:在这种方法中,我们使用它的构造函数创建一个选项生成器,它需要服务集合和选项名称(或使用返回选项生成器的service.AddOptions&lt;TOptions&gt;() 扩展方法)。然后我们使用 Configure、PostConfigure 和 Validate 或 Bind 方法以链式方式配置此选项 Builder(这些方法不同于为服务集合定义的(Configure、PostConfigure、ConfigureOptions、ConfigureAll、PostConfigureAll)作为扩展方法)。 OptionsBuilder 的每个方法都在内部执行此操作: service.AddTransient&lt;IConfigureOptions&gt;() 并致电 AddOptions()。 2-使用为服务容器定义的扩展方法(ConfigurePostConfigureConfigureOptionsConfigureAllPostConfigureAll),几乎如下: // 配置服务集合的扩展方法

    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的每个方法的定义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-23
      • 1970-01-01
      • 2021-04-10
      • 1970-01-01
      • 1970-01-01
      • 2012-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多