在 ASP.NET Core 中加载配置时 services.Configure() 和 services.AddOptions<T>().Bind() 有什么区别?

mls*_*lst 20 c# asp.net-core

在我的 ASP.NET Core 2.2 WebApi 项目中,我想将配置加载appsettings.json到强类型对象中。

appsettings.json 有以下配置部分:

{
  "MySettings1": {
    "Name": "John Smith",
    "Age": "25",
  }
}
Run Code Online (Sandbox Code Playgroud)

我想加载到强类型对象中MySettings

public class MySettings
{
    public string Name { get; set; }
    public int Age { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我可以在我的Startup.ConfigureServices()方法中这样做:

services.Configure<MySettings>(configuration.GetSection("MySettings1"));
Run Code Online (Sandbox Code Playgroud)

或者像这样:

services.AddOptions<MySettings>().Bind(configuration.GetSection("MySettings1"));
Run Code Online (Sandbox Code Playgroud)

这两种方法有什么区别?它们都工作正常,因为我能够在这两种情况下获得适当的IOptions<MySettings>注入实例HomeController

在某些特定情况下,我应该使用一种方法而不是另一种方法吗?(例如,将来我可能希望在从配置填充 MySettings 对象后添加某种运行时验证,所以在这种情况下,我应该更喜欢一种方法吗?)

Pan*_*vos 24

这是在 2018 年 11 月的 Github 问题中提出的问题: AddOptions() 与 Multiple Configure(...)。这两种方法都做同样的工作,但AddOptions后来出现并允许更多的自定义。

Configure(Action configureOptions) 和 OptionsBuilder.Configure(Action configureOptions) 最终都会做同样的事情:

services.AddSingleton<IConfigureOptions<TOptions>>(
    new ConfigureNamedOptions<TOptions>(name, configureOptions));
Run Code Online (Sandbox Code Playgroud)

而 OptionsBuilder.Bind(IConfiguration config) 实际上会直接调用 Configure(IConfiguration config),所以它们也是等价的。

所以这两个 API 是可以互换的。您可以期待 services.Configure 调用继续工作。选项构建器 API 稍后出现,以允许对各种实用程序方法进行更多控制。但它不能替代直接 services.Configure API。


mic*_*amp 9

我不确定何时添加此功能,但使用AddOptions数据注释公开了设置类的验证。

特别有价值的是ValidateOnStart在启动期间执行验证的方法,以便可以立即捕获问题。如果不使用它,那么您可能会在运行时遇到配置错误的问题。

有关使用 OptionsBuilder 进行验证的文档