C# 从自定义数据批注属性访问IConfiguration

C# 从自定义数据批注属性访问IConfiguration,c#,.net-core,dependency-injection,attributes,.net-5,C#,.net Core,Dependency Injection,Attributes,.net 5,我目前正在尝试将公司的开发框架从.NETFramework 4.7转换为.NET5 在旧代码中,有一系列自定义验证属性继承自System.ComponentModel.DataAnnotations.RegularExpressionAttribute 这些都有以下行为 检查配置文件中是否指定了正则表达式 如果指定了正则表达式,则将其传递给基类 如果未指定正则表达式,请将硬编码正则表达式传递给基类 如何从.NET 5中的数据批注验证属性内部访问配置 我知道我可以在所有验证属性上创建一个静态配置方

我目前正在尝试将公司的开发框架从.NETFramework 4.7转换为.NET5

在旧代码中,有一系列自定义验证属性继承自System.ComponentModel.DataAnnotations.RegularExpressionAttribute

这些都有以下行为

  • 检查配置文件中是否指定了正则表达式
  • 如果指定了正则表达式,则将其传递给基类
  • 如果未指定正则表达式,请将硬编码正则表达式传递给基类
  • 如何从.NET 5中的数据批注验证属性内部访问配置

    我知道我可以在所有验证属性上创建一个静态配置方法,并在应用程序启动时手动注入IConfiguration,但这似乎笨拙且不雅观,所以我希望有更好的方法

    我不希望每次使用该属性时都将配置文件中的值作为参数传入,因为这在某种程度上违背了我们自定义正则表达式验证属性的观点,并且增加了有人出错并将不正确的值传入该属性的可能性

    在.NET framework版本中,使用configuration manager完成对配置文件的访问。在.NET5中,这并不是一个真正的选项(因为我正试图从*.config文件转移到.NETCore更灵活的系统)


    我已经搜索了如何注入ASP.Net核心属性,但我找到的所有结果似乎都与Actionfilter和ServiceFilter有关,它们似乎与数据注释属性没有多大关联

    您可以尝试以下方法:


    var config=(IConfiguration)validationContext.GetService(typeof(IConfiguration))

    所以重写IsValid方法以检查配置条目是否存在,如果存在,则相应地更新regex pattern属性,然后调用基本IsValid方法?这是一种非常优雅的方式。这能回答你的问题吗?被动属性部分不适用,我不认为它与动作过滤器属性相关,不是数据注释,而是谦逊的部分。我是否可以按照下面@Usman Khan的回答中建议的方式访问容器