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
我正在尝试将 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