【发布时间】:2018-07-03 02:38:50
【问题描述】:
在我们的域中,我们有 Student ,每个学生都有名字、姓氏和学号。学号的业务规则是,学号可以是1到99999之间的任意数字。由于这个验证属于领域层,我为此写了一个类,比如;
public class StudentNumber : ValueObject
{
public StudentNumber(int value)
{
if (value <= 0 || value > 99999)
{
throw new ArgumentOutOfRangeException(
nameof(value),
"Student number must be in range of (0,9999]");
}
Value = value;
}
public int Value { get; private set; }
public static implicit operator StudentNumber(int value)
{
return new StudentNumber(value);
}
}
但是,最好在应用层验证输入。因此,我最终得到了一个可以在下面找到的验证类(通过使用 FluentValidation 库);
public class CreateStudentCommandValidator : AbstractValidator<CreateStudentCommand>
{
public CreateStudentCommandValidator()
{
RuleFor(m => m.StudentNumber)
.ExclusiveBetween(0, 100000)
.WithMessage(ErrorCodes.InvalidStudentNo);
}
}
在 CreateStudentCommand 中,StudentNumber 属性数据类型为整数。
这个验证器有效,但是它违反了 DRY 规则。因为我在域层和应用程序中重复验证逻辑。
问题是;在 FluentValidation 验证器类中使用域验证代码的最佳做法是什么?
【问题讨论】:
-
关于模式和其他设计问题的讨论并不适合 stackoverflow,它们是主观的,无法量化(通常),并且本质上只是基于意见,甚至更糟糕的是,基于其他人的意见跨度>
标签: c# domain-driven-design fluentvalidation