由于具有隐藏属性,因此无法使用FluentValidation验证分层对象

时间:2019-08-13 16:35:26

标签: c# fluentvalidation

我有一组没有Id属性的基本DTO(用于创建对象),我有一组相应的常规DTO(从base继承并通过id列扩展)。此外,这些DTO包含具有完全相同方法的子对象-DeviceBaseDto包含VehicleBaseDto(不带id),DeviceDto包含VehicleDto(继承自VehicleBaseDto并添加id属性)。

 public class DeviceBaseDto
    {
        [Required]
        public string Name { get; set; }

        public VehicleBaseDto Vehicle {get;set;}

        //a lot more properties
    }

public class DeviceDto : DeviceBaseDto
{
    public int Id { get; set; }
    public new VehicleDto Vehicle { get; set; }

}

现在让我们转到验证器对象。我想要实现的是在基本验证器对象中包含所有baseDto规则。然后,我将其他规则(用于继承类中的属性)放入常规验证器中。

public class DeviceBaseValidator<TDeviceBase> : AbstractValidator<TDeviceBase> where TDeviceBase : DeviceBaseDto
    {
        public DeviceBaseValidator()
        {
           RuleFor(x => x.Vehicle).SetValidator(new VehicleBaseValidator<VehicleBaseDto>());
           RuleFor(x => x.Vehicle).NotNull();
           //a lot of validation
        }
}}
public class DeviceValidator : DeviceBaseValidator<DeviceDto>
{
    public DeviceValidator()
    {
        RuleFor(x => x.Id).GreaterThan(0);
    }
}

public class VehicleValidator : VehicleBaseValidator<VehicleDto>
{
    public VehicleValidator()
    {
        RuleFor(x => x.Id).GreaterThan(0);
    }
}

当我尝试运行验证时:

var deviceValidator = new DeviceValidator();
var validationResult = deviceValidator.Validate(deviceDto);

无法说明VehicleDto为空。因为我们在DeviceDto类中为Vehicle属性使用了“ new”关键字,所以它希望获取VehicleBaseDto,但改为获取VehicleDto。换句话说,VehicleValidatorBase失败:

RuleFor(x => x.Vehicle).NotNull();

但是如果我在VehicleValidator中输入完全相同的规则,它将通过验证。所以我想要的是:

  • 当收到DeviceDto时,我希望DeviceValidator在DeviceDtoBase属性上运行DeviceValidatorBase,并在DeviceDto.Vehicle属性上运行VehicleValidatorBase规则。
  • 我想使用DeviceValidator在DeviceDto.Vehicle上运行来自VehicleValidator的所有扩展规则,以及在DeviceDto上运行所有其他规则。

也许我创建的设计并不十分出色,所以我很高兴听到关于如何构造这些对象的任何建议。

0 个答案:

没有答案