使用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
}
答案 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