使用 Fluent Validation 维护输入格式或调整输入

Use Fluent Validation to maintain input formats, or tweak input

使用 Fluent Validation 调整数据是否合适? 例如我们有一个电话号码字段,服务层接受匹配特定正则表达式的所有格式,以下所有格式都是相同号码的有效格式:

+2 010 00011122
+201000011122
00201000011122

我想在数据库中保留一种格式,但允许我的所有客户使用任何格式。 我正在考虑在验证过程中操纵模型值,如下所示:

   RuleFor(m => m.Phone)
            .NotEmpty().WithMessage(Common.ResourceFiles.Validation.Required)
            .Matches("Constants.Regex.Phone").WithMessage(Common.ResourceFiles.Validation.InvalidFormat)
            .DependentRules(d => d.RuleFor(m => m.Phone).Must(
                (model, phone) =>
                {
                    if (phone.StartsWith("+"))
                        model.Phone = model.Phone.Replace("+", "00");
                    // Other changes here
                    return true;
                }));

这样做合法吗?如果不是,哪一层应该执行这样的逻辑?

我不会走那条路,它验证了单一责任原则,如果您的调整有误,发现错误会非常混乱。

相反, 您可以创建某种清理过滤器,您可以轻松切换 on/off,最重要的是进行测试。在这种情况下,您的验证逻辑也会变得更简单。

剪下非常幼稚的代码来理解想法:

public class ContactSanitizer
{
    public void Sanitize(ContactDto contact)
    {
        var phone = contact.Phone;

        if (phone.StartsWith("+"))
            contact.Phone = phone.Replace("+", "00");
    }
}