![]() |
个性的电影票 · 湖南大学2021年攻读硕士学位研究生招生简章 ...· 3 月前 · |
![]() |
魁梧的饭盒 · 看北欧女主家,才知道什么是真正的生活,舒适又 ...· 3 月前 · |
![]() |
兴奋的草稿纸 · 网易新闻产品分析报告 | 人人都是产品经理· 6 月前 · |
![]() |
豪情万千的山羊 · 联想小新air14指纹失效解决方法_联想小新 ...· 6 月前 · |
我有一个控制台应用程序,在这个应用程序中,我试图将一个配置部分绑定到这样的自定义对象类型列表中:
List<myObject> myObjectList = new List<myObject>();
config.GetSection("Objects").Bind(myObjectList);
public enum CustomEnum{
public class myObject{
public CustomEnum myEnum { get; set; }
}
我的问题是,如果在配置文件中,您没有为该属性提供适当的枚举值(即三,而不是上面所示的一个或两个),它将无法绑定对象,并且不会抛出错误,告诉您它失败了。因此,基本上我如何使它,使我知道绑定失败,因为一个不正确的配置值?现在,它只是没有绑定那些失败的特定项目,这意味着没有真正的方法来知道有项目丢失。
成功绑定一个对象但失败并忽略另一个对象的示例配置:
{
"Objects": [
"myEnum": "One"
"myEnum": "Three"
}
编辑:所以对于将来发现这个问题的人来说,基本上没有很好的解决方案。您只需要手动检查,或者在配置中根本不使用枚举。
发布于 2019-10-09 14:52:41
在绑定对象之前“手动”验证对象。
首先将配置的值循环为字符串。查看它们是否与枚举中的现有项匹配。使用IsDefined函数。
https://learn.microsoft.com/en-us/dotnet/api/system.enum.isdefined?view=netframework-4.8
如果不抛出异常。
如果所有项都在枚举中,请像往常一样使用Bind方法。
public static bool ValidateConfig(object jsonConfig)
foreach (string item in jsonConfig) // loop through the config items as string
if (!Enum.IsDefined(typeof(CustomItem), item))
throw new Exception("Enum value does not exist.");
}
发布于 2019-10-09 15:04:35
基于这个 帖子
ASP.NET核心配置系统非常灵活,允许您使用强类型设置。然而,部分由于这种灵活性,可能会出现只在特定环境中出现的配置错误。默认情况下,只有当代码试图使用无效的配置值(如果有的话)时,才会发现这些错误。 当应用程序启动时,您可以使用
IStartupFilter
来验证您的设置。这可以确保您尽快了解配置错误,而不是在运行时。
因此,首先您需要创建如下所示的
interface
:
public interface IValidatable
void Validate();
}
然后:
public class SettingValidationStartupFilter : IStartupFilter
readonly IEnumerable<IValidatable> _validatableObjects;
public SettingValidationStartupFilter(IEnumerable<IValidatable> validatableObjects)
_validatableObjects = validatableObjects;
public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
foreach (var validatableObject in _validatableObjects)
validatableObject.Validate();
//don't alter the configuration
return next;
}
然后,您需要向DI容器注册过滤器:
public void ConfigureServices(IServiceCollection services)
services.AddTransient<IStartupFilter, SettingValidationStartupFilter>()
// other service configuration
}
最后,您需要在要在启动时验证的设置上实现
IValidatable
接口:
public class myObject : IValidatable
public CustomEnum myEnum { get; set; }
![]() |
兴奋的草稿纸 · 网易新闻产品分析报告 | 人人都是产品经理 6 月前 |