使用 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");
}
}
使用 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");
}
}