首页 > 解决方案 > 等价于配置使用 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);
}

在 Module 的 Load-method 中注册是怎样的

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

标签: asp.net-coreautofac

解决方案


我最近遇到了同样的问题,我实现了以下内容,以便您仍然可以使用 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”是配置中的部分名称,MyOptionstype 是具有保存结果的字段的 POCO 类。

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


推荐阅读