与使用autofac模块的Configure <T>等效

Jeh*_*hof 5 autofac asp.net-core

Configure<TOptions>OptionsConfigurationServiceCollectionExtensions使用Autofac模块时的方法等效吗?

我的ConfigureServices方法看起来像这样,但是我想将其services.Configure<MyOptions>(Configuration.GetSection("MyOptions"))移至MyModule。

public IServiceProvider ConfigureServices(IServiceCollection services) {
    services.Configure<MyOptions>(Configuration.GetSection("MyOptions"));

    var containerBuilder = new ContainerBuilder();
    containerBuilder.Populate(services);
    containerBuilder.RegisterModule<MyModule>();

    var container = containerBuilder.Build();
    return new AutofacServiceProvider(container);
}
Run Code Online (Sandbox Code Playgroud)

注册在模块的加载方法中的外观如何

protected override void Load(ContainerBuilder builder)
{
    // configure options here
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*att 6

我个人对 Autofac 并不熟悉,但一般来说,Configure<T>所做的一切都是 1) 将特定的配置部分绑定到一个类,以及 2) 将该类注册到服务集合中,因此可以直接注入它。

因此,您可以改为使用以下内容来绑定您的强类型配置:

var config = config.GetSection("MyOptions").Get<MyOptions>();
Run Code Online (Sandbox Code Playgroud)

然后,您只需将其注册为 Autofac 中的常量即可。

  • 你是对的:`builder.Register(p =&gt; configuration.GetSection("MyOptions").Get&lt;MyOptions&gt;()).SingleInstance();` (4认同)

小智 6

我最近遇到了同样的问题,我实现了以下内容,以便您仍然可以使用 IOptions、IOptionsMonitor 和 IOptionsSnapshot,但从 AutoFac 模块注册配置。

前提是你调用services.AddOptions()ConfigureServices方法:

var sfConfig = _configuration.GetSection("MyOptions");

builder.Register(ctx => new ConfigurationChangeTokenSource<MyOptions>(Options.DefaultName, sfConfig))
       .As<IOptionsChangeTokenSource<MyOptions>>()
       .SingleInstance();

builder.Register(ctx => new NamedConfigureFromConfigurationOptions<MyOptions>(Options.DefaultName, sfConfig, _ => { }))
       .As<IConfigureOptions<MyOptions>>()
       .SingleInstance();
Run Code Online (Sandbox Code Playgroud)

这要求您在 ConfigureServices 方法中运行 services.AddOptions()。

在上面的示例中,“MyOptions”是您配置中的部分名称,而MyOptionstype 是具有保存结果的字段的 POCO 类。

这基本上是微软在这里的转换:https : //github.com/aspnet/Options/blob/master/src/Microsoft.Extensions.Options.ConfigurationExtensions/OptionsConfigurationServiceCollectionExtensions.cs