使用 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
}
我个人对 Autofac 并不熟悉,但一般来说,
Configure<T>
所做的只是 1)将特定配置节绑定到类,2)将该类注册到服务集合中,以便可以直接注入。
因此,您可以使用以下内容来绑定强类型配置:
var myOptions = config.GetSection("MyOptions").Get<MyOptions>();
然后,您只需使用 Autofac 将其注册为单例范围中的常量即可。
我最近遇到了同样的问题,我实现了以下内容,以便您仍然可以使用 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 类。
启动.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();
}
}