【发布时间】:2020-09-08 16:21:47
【问题描述】:
我正在使用Fluent validation 库来验证来自webApi 的传入请求,并使用以下模型结构进行验证:
public class BaseClass
{
public MyEnum MyProperty { get; set; }
}
public class DerivedClass : BaseClass
{
public new string MyProperty { get; set; }
}
请注意 new 关键字用于 DerivedClass.MyProperty 属性。
这是我流畅的验证实现:
public class BaseClassValidator<T> : AbstractValidator<T> where T : BaseClass
{
public BaseClassValidator()
{
RuleFor(prop => prop.MyProperty).IsInEnum();
}
}
public class DerivedClassValidator<T> : BaseClassValidator<DerivedClass>
{
public DerivedClassValidator()
{
RuleFor(prop => prop.MyProperty).NotEmpty();
}
}
要验证的传入模型的类型为DerivedClass。
不过,我还有其他几个属性,我将它们切断以进行更多说明。
问题是,FluentValidator 调用BaseClass 和DerivedClass 的验证,而所需的行为是仅验证DerivedClass 的属性当属性被new 关键字覆盖时 并保留 BaseClass 的同名属性未选中。
问题是:是否有任何内置功能支持这种情况“以抑制对DerivedClass 中覆盖的BaseClass 属性的验证,而不是对这些属性使用相应的DerivedClass 验证”?
【问题讨论】:
-
你确定这里需要继承吗?每当你觉得你需要使用
new关键字时,这很好地表明你在滥用继承——要么是从错误的基类继承,要么是使用继承而不是组合。当然,这是一个经验法则——在某些例外情况下,使用new关键字隐藏继承的成员是最明智的做法。 -
我不确定您的第二个代码 sn-p 是否有意义。您是否只是将属于方法或属性的代码直接放入类中?
-
@Battle 当然,我修好了。
标签: c# asp.net-core fluentvalidation