gpt4 book ai didi

c# - FluentValidation:仅验证设置了一个属性

转载 作者:行者123 更新时间:2023-12-03 16:00:58 27 4
gpt4 key购买 nike

我正在努力为一个类实现一个验证器,其中应该只设置一个属性。
假设我们有以下类:

public class SomeClass
{
public DateTime SomeDate {get; set;}
public IEnumerable<int> FirstOptionalProperty {get; set;}
public IEnumerable<int> SecondOptionalProperty {get; set;}
public IEnumerable<int> ThirdOptionalProperty {get; set;}
}
这个类有一个强制属性 - SomeDate .其他属性是可选的,只能设置一个,例如如果 FirstOptionalProperty已设置 - SecondOptionalPropertyThirdOptionalProperty如果 SecondOptionalProperty 应该为空已设置 - FirstOptionalPropertyThirdOptionalProperty应该为空等等。
换句话说:如果设置了 IEnumerable Prop 之一 - 其他 IEnumerables 应该为空。
关于为此类类实现验证器的任何提示/想法?我唯一想到的是写大块 When规则,但这种编写代码的方式很容易出错,而且结果看起来很丑陋。

最佳答案

您可以利用 Must重载使您可以访问整个类对象,以便您可以针对其他属性进行属性验证。见 FluentValidation rule for multiple properties更多细节。

public class SomeClassValidator : AbstractValidator<SomeClass>
{
private const string OneOptionalPropertyMessage = "Only one of FirstOptionalProperty, SecondOptionalProperty, or ThirdOptionalProperty can be set.";

public SomeClassValidator()
{
RuleFor(x => x.FirstOptionalProperty)
.Must(OptionalPropertiesAreValid)
.WithMessage(OneOptionalPropertyMessage);

RuleFor(x => x.SecondOptionalProperty)
.Must(OptionalPropertiesAreValid)
.WithMessage(OneOptionalPropertyMessage);

RuleFor(x => x.ThirdOptionalProperty)
.Must(OptionalPropertiesAreValid)
.WithMessage(OneOptionalPropertyMessage);
}

// this "break out" method only works because all of the optional properties
// in the class are of the same type. You'll need to move the logic back
// inline in the Must if that's not the case.
private bool OptionalPropertiesAreValid(SomeClass obj, IEnumerable<int> prop)
{
// "obj" is the important parameter here - it's the class instance.
// not going to use "prop" parameter.

// if they are all null, that's fine
if (obj.FirstOptionalProperty is null &&
obj.SecondOptionalProperty is null &&
obj.ThirdOptionalProperty is null)
{
return true;
}

// else, check that exactly 1 of them is not null
return new []
{
obj.FirstOptionalProperty is not null,
obj.SecondOptionalProperty is not null,
obj.ThirdOptionalProperty is not null
}
.Count(x => x == true) == 1;
// yes, the "== true" is not needed, I think it looks better
}
}
您可以调整检查功能。就目前而言,如果您设置 2 个或更多可选属性,所有这些属性都会引发错误。这可能适合也可能不适合您的需求。
您也可以制作 RuleFor仅适用于第一个可选属性,而不是所有属性,因为所有属性都将执行相同的 IsValid 代码并返回相同的消息,如果您的用户收到 OptionalProperty1 的错误消息但他们没有,他们可能会感到有点困惑不提供那个。
这种方法的缺点是您需要在编译时知道所有属性是什么(以便您可以为其编写代码),并且如果您添加/删除可选条目,则需要维护此验证器。这个缺点对你来说可能重要也可能不重要。

关于c# - FluentValidation:仅验证设置了一个属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66784215/

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