相当于使用autofac模块配置<t>

时间:2018-06-19 08:50:21

标签: asp.net-core autofac

使用Autofac模块时,Configure<TOptions>的方法OptionsConfigurationServiceCollectionExtensions相当于什么?

我的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);
}

如何在模块的Load-method中注册?

protected override void Load(ContainerBuilder builder)
{
    // configure options here
}

2 个答案:

答案 0 :(得分:3)

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

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

var config = config.GetSection("MyOptions").Get<MyOptions>();

然后,您只需在Autofac中将其注册为单例作用域中的常量。

答案 1 :(得分:3)

我最近也遇到了同样的问题,我实施了以下操作,以便您仍然可以使用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();

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

在上面的示例中,“ MyOptions”是配置中的节名称,MyOptions type是具有保存结果的字段的POCO类。

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

相关问题