DTO 和域模型的一致验证规则

Consistent validation rules for both Dto and Domain model

提问人:bbartels 提问时间:2/4/2018 更新时间:2/4/2018 访问量:2726

问:

我希望使用 FluentValidate 验证我的 Dto 和 Domain 模型。 我已经定义了一个 Validator 类来验证我的 Dto,如下所示。

但是,如果我还想为我的领域模型添加一个验证器,则其中一个验证器的更改不会反映在另一个验证器中。例如,如果我将密码长度的规则从 6 更改为 7,则必须在两个地方都更改它。

有没有某种方法可以潜在地从领域模型或类似的东西继承规则,以实现跨 Dto 和领域模型的一致规则?

DTO:

public class NewUserDto
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Username { get; set; }
    public string Email { get; set; }
    public string Password { get; set; }
}

public class NewUserDtoValidator : AbstractValidator<NewUserDto>
{
    public NewUserDtoValidator()
    {
        RuleFor(x => x.FirstName).Length(2, 50);
        RuleFor(x => x.LastName).Length(2, 50);
        RuleFor(x => x.Email).EmailAddress();
        RuleFor(x => x.Username).Length(4, 25);
        RuleFor(x => x.Password).MinimumLength(6);
    }
}

领域模型:

public class User
{
    public uint Id { get; private set; }

    public string Username { get; private set; }
    public string FirstName { get; private set; }
    public string LastName { get; private set; }
    public string Email { get; private set; }
    public DateTime RegistrationDate { get; private set; }
    public string Hash { get; private set; }
    public string Salt { get; private set; }
}
C# 验证 FluentValidation 一致性

评论

2赞 Scott Hannen 2/4/2018
如果必须做出选择,领域模型的验证是最重要的,因为这是真正的逻辑所在。如果始终使用有效的域模型,则从域返回的 DTO 将有效,如果进入域的无效 DTO 不能用于形成有效的域模型,则它们将被拒绝。
2赞 bbartels 2/4/2018
@ScottHannen 但是我想返回为什么从客户端发布的 DTO 无效,并且我真的不想将业务层错误消息返回给客户端。我觉得这是一个应该更普遍的问题。不太确定为什么没有简单的方法可以做到这一点。
0赞 Scott Hannen 2/4/2018
我并不是说不要验证 dto。但听起来您正在验证 dto 而不是领域模型,或者对在哪里验证持观望态度。
1赞 Roman Koliada 2/6/2018
如果它与您的设计不矛盾,您可以为公共字段和基本验证器创建一个接口:class BaseUserValidator: AbstractValidator<IUser> {}
1赞 Tagc 6/29/2020
@bbartels 正是这样的问题让我在凌晨 2 点保持清醒。你最终选择了什么方法?目前,我正在处理的项目非常简单,我不需要为DTO而烦恼 - 我直接反序列化到域实体,并通过FluentValidation为它们应用验证规则。但是,我可能是时候创建 DTO,但随之而来的不仅是复制数据,还有验证逻辑。

答:

-2赞 Vladislav Rastrusny 2/4/2018 #1

要在实体之间共享相同的验证规则,可以使用自定义验证程序: https://github.com/JeremySkinner/FluentValidation/wiki/e.-Custom-Validators

评论

0赞 kipusoep 1/31/2022
此答案缺少对如何在此方案中使用自定义验证程序的解释。