我有一组没有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中输入完全相同的规则,它将通过验证。所以我想要的是:
也许我创建的设计并不十分出色,所以我很高兴听到关于如何构造这些对象的任何建议。