Microsoft 通用主机应用程序运行时配置:我真的需要在我的代码库中喷洒 "IOptions<>" 吗?

Microsoft generic host app runtime configuration: Do I really need to spray "IOptions<>" throughout my code base?

我正在尝试将 Microsoft 的“hosting/logging/configuration/dependency 注入”用于 .Net 5.0 中的新控制台应用程序。首先介绍一下背景知识:我对这一切完全陌生,而且我从未使用过 ASP.NET 中显然早已存在的任何类似内容(事实上我认为我什至从未使用过 ASP.NET ,如果我这样做了,那是很久很久以前的事了,而且非常小)。话虽如此:

我觉得我在配置方面遗漏了一些东西,特别是将 appsettings.json(或其他)的一部分绑定到选项 class。假设我有一个预先存在的 class -- 不是专门用于 Microsoft 的 DI/etc。框架——在其构造函数中采用某种选项 class:

public X(XOptions options) {
   this.Blah = options.OneThirtySeventhBlah * 37;
}

我发现了各种如何将 appsettings.json 中的东西获取到我的代码中的示例:

services.Configure<XOptions>(options => hostContext.Configuration.GetSection("X").Bind(options));

但是在 运行 之后,我发现(令我惊讶的是)它不适用于我之前存在的 X class。为了让它工作,我还必须更改 X 的构造函数(或者,我想,至少添加一个新的构造函数)以采用 IOptions<XOptions> 而不是简单地采用 XOptions :

public X(IOptions<XOptions> options) {
   this.Blah = options.Value.OneThirtySeventhBlah * 37;
}

一切正常,但是...我在这里遗漏了什么吗?我真的必须更改我预先存在的 class(同样,它不是专门用于此类框架的)以将所有这些额外的 Microsoft 内容作为依赖项吗?

我想我可以改为编写 MicrosoftifiedX class,在其构造函数中采用 IOptions<XOptions> 并实现与 X 相同的接口,然后制作该部分一个可选包,但是......就像我说的,我觉得我错过了什么。我真的不能直接将配置绑定到 XOptions 吗?如果可以,怎么做?

如果我不能,那么我不禁想象可能有一些标准(或至少相当广泛)framework/pattern/library 来处理这个比我的 [=18] 更乏味的=] 想法。有谁知道这样的事情?谢谢。

是的,我认为 you should 可以防止让您的业务线 类 依赖 IOption<T>。相反,将选项对象注册为单例:

XOptions xoptions = config.GetSection("SectionName").Get<XOptions>();

// Verify XOptions here (if required)

// Register XOptions as singleton
services.AddSingleton<XOptions>(xoptions);
services.AddTransient<IX, X>(); // X takes a dependency on XOptions