【发布时间】:2018-08-05 08:26:03
【问题描述】:
Core2 有一个钩子用于验证从appsettings.json 读取的选项:
services.PostConfigure<MyConfig>(options => {
// do some validation
// maybe throw exception if appsettings.json has invalid data
});
此验证码在首次使用 MyConfig 时触发,之后每次都触发。所以我得到了多个运行时错误。
但是在启动期间运行验证更明智 - 如果配置验证失败,我希望应用程序立即失败。 docs imply that 是它的工作原理,但事实并非如此。
那我做对了吗?如果是这样,而且这是设计使然,那么我该如何更改我正在做的事情以使其按我想要的方式工作?
(另外,PostConfigure 和PostConfigureAll 有什么区别?这种情况下没有区别,那么我应该什么时候使用呢?)
【问题讨论】:
-
这是一篇反对注入 IOptions
并建议解决方法的文章。 simpleinjector.readthedocs.io/en/latest/… -
@Nkosi 对此事的看法很有趣,将重新考虑,谢谢。
-
@Nkosi:我非常不同意链接的文档,因为首先
IOptions<T>可以以与使用services.Configure<T>(instanceOfT)时相同的方式配置,其次IOptionsSnapshot<T>还提供重新加载设置,而应用程序运行。第三,当有人更改其中的值而请求已经在进行中时,单例设置可能会出现很大问题。这样,请求可能以选项的一个值开始,并可能以不同的值结束。对于IOptions<T>,这不会发生(仅在请求中),因为它有一个作用域的生命周期 -
如果真的想验证配置,可以在
Configure方法中创建一个范围提供程序,在那里解析并检查/验证配置(即通过解析选项并访问/验证其参数) .当此处发生错误时,应用程序将无法启动 -
@Tseng 同意。我只是提出不同的论点来权衡可用的利弊。配置建议看起来非常好,与提供的答案相似。我关心的一个问题是耦合到框架问题,但这也可以抽象出另一层。
标签: c# validation asp.net-core