gpt4 book ai didi

c# - .NET 中的验证框架,可以在字段之间进行编辑

转载 作者:太空狗 更新时间:2023-10-30 00:58:45 25 4
gpt4 key购买 nike

根据我的经验,.NET 中的许多验证框架都允许您一次验证一个字段,例如确保某个字段是邮政编码或电子邮件地址。我通常将这些称为场内编辑。

不过,在我的项目中,我们经常需要进行场间编辑。例如,如果您有这样一个类:

public class Range
{
public int Min { get; set; }
public int Max { get; set; }
}

您可能希望确保最大值大于最小值。您可能还想对外部对象进行一些验证。例如,假设你有这样一个类:

public class Person
{
public string PostalCode { get; set; }
}

无论出于何种原因,您都希望确保邮政编码存在于数据库或提供给您的文件中。我有更复杂的示例,例如用户提供数据字典并且您想根据该数据字典验证您的对象。

我的问题是:我们可以为 .NET 使用任何现有的验证框架(TNValidate、NHibernate Validator)还是我们需要使用规则引擎或什么?现实世界中的人们如何处理这种情况? :-)

最佳答案

我只知道一个验证框架,那就是Enterprise Library Validation Application Block , 或简称 VAB。我将从 VAB 的上下文中回答您的问题。

第一个问题:能否在 VAB 中进行状态(字段间)验证?

是的,你可以。有多种方法可以做到这一点。您可以选择 self 验证机制,如下所示:

[HasSelfValidation]
public class Range
{
public int Min { get; set; }
public int Max { get; set; }

[SelfValidation]
public void ValidateRange(ValidationResults results)
{
if (this.Max < this.Min)
{
results.AddResult(
new ValidationResult("Max less than min", this, "", "", null));
}
}
}

我必须说我个人不喜欢这种类型的验证,尤其是在验证我的域实体时,因为我喜欢将验证与验证逻辑分开(并使我的域逻辑不引用任何验证框架) .但是,与编写自定义验证器类的备选方案相比,他们需要的代码要少得多。这是一个例子:

[ConfigurationElementType(typeof(CustomValidatorData))]
public sealed class RangeValidator : Validator
{
public RangeValidator(NameValueCollection attributes)
: base(string.Empty, string.Empty) { }

protected override string DefaultMessageTemplate
{
get { throw new NotImplementedException(); }
}

protected override void DoValidate(object objectToValidate,
object currentTarget, string key, ValidationResults results)
{
Range range = (Range)currentTarget;

if (range.Max < range.Min)
{
this.LogValidationResult(results,
"Max less than min", currentTarget, key);
}
}
}

写完这个类之后,你可以像这样在你的验证配置文件中连接这个类:

<validation>
<type name="Range" defaultRuleset="Default" assemblyName="[Range Assembly]">
<ruleset name="Default">
<validator type="[Namespace].RangeValidator, [Validator Assembly]"
name="Range Validator" />
</ruleset>
</type>
</validation>

第二个问题:如何通过可能的数据库交互(使用 VAB)进行复杂的验证。

我为第一个问题提供的示例也可用于此。您可以使用相同的技术: self 验证和自定义验证器。您想要检查数据库中的值的场景实际上很简单,因为对象的有效性不基于其上下文。您可以简单地根据数据库检查对象的状态。当对象所在的上下文变得重要时,它会变得更加复杂(但是使用 VAB 是可能的)。例如,假设您想编写一个验证程序,以确保每个客户在给定时刻的未发货订单不超过两个。这不仅意味着您必须检查数据库,而且可能在同一上下文中添加新订单或删除订单。这个问题不是 VAB 特有的,您选择的每个框架都会遇到同样的问题。我写了an article这描述了我们在这些情况下所面临的复杂性(阅读和颤抖)。

第三个问题:现实中的人们如何应对这种情况?

我在生产代码中使用 VAB 进行这些类型的验证。效果很好,但是 VAB 不是很容易学。不过,我喜欢我们可以用 VAB 做的事情,而且只有在 v5.0 发布时它才会变得更好。如果您想学习它,请先阅读您可以在 Hands-On Labs 中找到的 ValidationHOL.pdf 文档。下载。

希望对您有所帮助。

关于c# - .NET 中的验证框架,可以在字段之间进行编辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2258513/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com