【问题标题】:What is the use case of IOptions versus IConfiguration (other than IOptions allows mapping to object)?IOptions 与 IConfiguration 的用例是什么(IOptions 允许映射到对象除外)?
【发布时间】:2022-11-23 01:32:28
【问题描述】:

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

服务类中的示例代码:

public MyService(IConfiguration config)
        {
            _key = config["MyKey"];
        }

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

例子:

public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<MySettings>(Configuration.GetSection("MySettings"));
...
}

然后将 IOption 注入构造函数。

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

【问题讨论】:

    标签: .net-core .net-6.0


    【解决方案1】:

    documentation 中所述,有时您更喜欢按组或场景拆分设置,使用 IOptions 这真的很容易。

    services.Configure<AppSettings1>(configuration.GetSection("AppSettings1"));
    services.Configure<AppSettings2>(configuration.GetSection("AppSettings2"));
    

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      检查这个教程https://www.youtube.com/watch?v=SizJCLcjbOA

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-06-18
        • 1970-01-01
        • 1970-01-01
        • 2019-07-17
        • 2019-02-04
        • 2019-06-12
        • 1970-01-01
        相关资源
        最近更新 更多