Jeh*_*hof 5 autofac asp.net-core
Configure<TOptions>与OptionsConfigurationServiceCollectionExtensions使用Autofac模块时的方法等效吗?
我的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);
}
Run Code Online (Sandbox Code Playgroud)
注册在模块的加载方法中的外观如何
protected override void Load(ContainerBuilder builder)
{
// configure options here
}
Run Code Online (Sandbox Code Playgroud)
我个人对 Autofac 并不熟悉,但一般来说,Configure<T>所做的一切都是 1) 将特定的配置部分绑定到一个类,以及 2) 将该类注册到服务集合中,因此可以直接注入它。
因此,您可以改为使用以下内容来绑定您的强类型配置:
var config = config.GetSection("MyOptions").Get<MyOptions>();
Run Code Online (Sandbox Code Playgroud)
然后,您只需将其注册为 Autofac 中的常量即可。
小智 6
我最近遇到了同样的问题,我实现了以下内容,以便您仍然可以使用 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();
Run Code Online (Sandbox Code Playgroud)
这要求您在 ConfigureServices 方法中运行 services.AddOptions()。
在上面的示例中,“MyOptions”是您配置中的部分名称,而MyOptionstype 是具有保存结果的字段的 POCO 类。
这基本上是微软在这里的转换:https : //github.com/aspnet/Options/blob/master/src/Microsoft.Extensions.Options.ConfigurationExtensions/OptionsConfigurationServiceCollectionExtensions.cs
| 归档时间: |
|
| 查看次数: |
1061 次 |
| 最近记录: |