相当于使用autofac模块的Configure<T>

问题描述 投票:0回答:3

使用 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-方法中的注册是什么样子的

protected override void Load(ContainerBuilder builder)
{
    // configure options here
}
asp.net-core autofac
3个回答
12
投票

我个人对 Autofac 并不熟悉,但一般来说,

Configure<T>
所做的只是 1)将特定配置节绑定到类,2)将该类注册到服务集合中,以便可以直接注入。

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

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

然后,您只需使用 Autofac 将其注册为单例范围中的常量即可。


11
投票

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

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


0
投票

启动.cs

  public void ConfigureContainer(ContainerBuilder builder)
        {
            // Register your own things directly with Autofac here. Don't
            // call builder.Populate(), that happens in AutofacServiceProviderFactory
            // for you.
            builder.RegisterModule(new AutofacModule(Configuration));
        }

AutofacModule.cs

 public class AutofacModule: Module
    {
        private IConfiguration configuration;

        public AutofacModule(IConfiguration configuration)
        {
            this.configuration = configuration;
        }

        protected override void Load(ContainerBuilder builder)
        {
            builder.Register(p => configuration.GetSection("AppAPIKey").Get<ConfigSettings>()).SingleInstance();
            builder.RegisterType<TestService>()
                .As<ITestService>()
                .SingleInstance();
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.