Asp.net-Core

等效於使用 autofac 模組的 Configure<T>

  • November 17, 2021

使用 Autofac 模組時Configure&lt;TOptions&gt;的方法等效於什麼?OptionsConfigurationServiceCollectionExtensions

我的 ConfigureServices 方法看起來像這樣,但我想將其services.Configure&lt;MyOptions&gt;(Configuration.GetSection("MyOptions"))移至 MyModule。

public IServiceProvider ConfigureServices(IServiceCollection services) {
   services.Configure&lt;MyOptions&gt;(Configuration.GetSection("MyOptions"));

   var containerBuilder = new ContainerBuilder();
   containerBuilder.Populate(services);
   containerBuilder.RegisterModule&lt;MyModule&gt;();

   var container = containerBuilder.Build();
   return new AutofacServiceProvider(container);
}

在 Module 的 Load-method 中註冊是怎樣的

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

我個人對 Autofac 並不熟悉,但一般來說,Configure&lt;T&gt;所做的只是 1)將特定的配置部分綁定到一個類,然後 2)將該類註冊到服務集合中,這樣就可以直接注入了。

因此,您可以改為使用以下內容來綁定您的強類型配置:

var config = config.GetSection("MyOptions").Get&lt;MyOptions&gt;();

然後,您只需使用 Autofac 將其註冊為單例範圍內的常量。

我最近遇到了同樣的問題,我實現了以下內容,以便您仍然可以使用 IOptions、IOptionsMonitor 和 IOptionsSnapshot,但要從 AutoFac 模組註冊配置。

前提是你呼叫services.AddOptions()方法ConfigureServices

var sfConfig = _configuration.GetSection("MyOptions");

builder.Register(ctx =&gt; new ConfigurationChangeTokenSource&lt;MyOptions&gt;(Options.DefaultName, sfConfig))
      .As&lt;IOptionsChangeTokenSource&lt;MyOptions&gt;&gt;()
      .SingleInstance();

builder.Register(ctx =&gt; new NamedConfigureFromConfigurationOptions&lt;MyOptions&gt;(Options.DefaultName, sfConfig, _ =&gt; { }))
      .As&lt;IConfigureOptions&lt;MyOptions&gt;&gt;()
      .SingleInstance();

這要求您在 ConfigureServices 方法中執行 services.AddOptions()。

在上面的範例中,“MyOptions”是配置中的部分名稱,MyOptionstype 是具有保存結果的欄位的 POCO 類。

這基本上是微軟在這裡的轉換:https ://github.com/aspnet/Options/blob/master/src/Microsoft.Extensions.Options.ConfigurationExtensions/OptionsConfigurationServiceCollectionExtensions.cs

引用自:https://stackoverflow.com/questions/50924242