IOptions 与 IConfiguration 的用例是什么(IOptions 允许映射到对象除外)?

var*_*ble 13 .net-core .net-6.0

我可以将 IConfiguration 配置注入构造函数,然后通过 config["settignName"]; 从 json 文件访问应用程序设置

服务类内的示例代码:

public MyService(IConfiguration config)
        {
            _key = config["MyKey"];
        }
Run Code Online (Sandbox Code Playgroud)

我遇到了 IOptions,它允许将应用程序设置从 json 文件映射到 .net 对象。

例子:

public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<MySettings>(Configuration.GetSection("MySettings"));
...
}
Run Code Online (Sandbox Code Playgroud)

然后将 IOption 注入到构造函数中。

IOptions 与 IConfiguration 的用例是什么(IOptions 允许映射到对象除外)?我没有看到在线示例中使用 IConfiguration,那么可以使用它还是应该切换到 IOption?

Cos*_*sta 10

不要将整个 IConfiguration 接口注入到您的服务中。

注入类(例如 SmtpOptions)而不是注入 IConfiguration 是更好的设计方法。当您注入 IConfiguration 时,这意味着客户端类(您的服务)需要了解配置文件的结构,并且它将使用像“Smtp:Host”这样的键访问某些配置。因此,它在客户端代码和配置结构之间创建了紧密耦合。因此,如果配置文件发生更改,您将必须更改每个客户端类。

使用 IOptions(或其他方法)将客户端类与配置解耦。例如,如果您决定从数据库而不是文件中读取配置,则只需更改一段负责读取和理解配置文件的代码。这比更改所有依赖于 IConfiguration 的类要好得多。这是一场维护噩梦。

解耦降低了应用程序的复杂性并使其更易于维护。

查看此教程https://www.youtube.com/watch?v=SizJCLcjbOA


Ped*_*rez 2

正如文档中所解释的,有时您更喜欢按组或方案拆分设置,使用 IOptions 可以非常轻松地实现这一点。

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

然后您可以在类构造函数中指定您需要哪一个。您可以有类似的东西,IConfiguration但您需要编写更多代码。

其他原因,我更喜欢使用属性而不是索引来访问配置值。如果我需要更新配置键,使用索引会更加痛苦。