도메인 객체 인 데이터 소스를 캡슐화하는 ViewModel이 있습니다. 도메인에는 도메인에 정의되어 있지만 ViewModel에서 다시 사용하여 사용자에게 정보를 제공하는 유효성 검사 규칙이 있습니다.유창한 인증 : 어떻게 속성 유효성 검사 (프로젝션)를 재사용 할 수 있습니까?
뷰 모델 :
internal class RatedValuesViewModel : FluentDataErrorInfo
{
public RatedValuesViewModel()
: base(new RatedValuesViewModelValidator())
{
}
public RatedValues DataSource { get; set; }
...
}
도메인 개체 :
class GeneratePlotPumpCurvesRatedValuesValidationRules : AbstractValidator<RatedValues>
{
public GeneratePlotPumpCurvesRatedValuesValidationRules()
{
Custom(itemToValidate => !AtLeastOneParameterSpecified(itemToValidate) ? new ValidationFailure(string.Empty, "You must specify at least one rated value.") : null);
RuleFor(item => item.Head).Must(head => head == null).When(item => item.DeltaPressure != null).WithMessage("You can not specify both head and delta pressure.");
RuleFor(item => item.DeltaPressure).Must(dp => dp == null).When(item => item.Head != null).WithMessage("You can not specify both head and delta pressure.");
}
...
}
마지막을 : 작업의 맥락에서
class RatedValues
{
public double? Head
{
get; set;
}
public double? DeltaPressure
{
get; set;
}
...
}
도메인 오브젝트 규칙은 우리가 수행하려고 : 도메인에서 유효성 검사 규칙을 다시 사용하는 뷰 모델에 대한 유효성 검사 규칙 :
class RatedValuesViewModelValidator : AbstractValidator<RatedValuesViewModel>
{
private readonly GeneratePlotPumpCurvesRatedValuesValidationRules _generatePlotPumpCurvesRatedValuesValidationRules = new GeneratePlotPumpCurvesRatedValuesValidationRules();
public RatedValuesViewModelValidator()
{
RuleFor(viewModel => viewModel.DataSource).SetValidator(_generatePlotPumpCurvesRatedValuesValidationRules);
Custom(viewModel =>
{
if (viewModel.DataSource == null)
return null;
ValidationResult validationResult = _generatePlotPumpCurvesRatedValuesValidationRules.Validate(viewModel.DataSource, viewModel.DataSource.GetPropertyName(vm => vm.Head));
return !validationResult.IsValid ? new ValidationFailure(viewModel.GetPropertyName(vm => vm.Head), CombineErrors(validationResult.Errors)) : null;
});
}
private static string CombineErrors(IEnumerable<ValidationFailure> errors)
{
StringBuilder combinedErrors = new StringBuilder();
errors.ForEach(error => combinedErrors.AppendLine(error.ErrorMessage));
return combinedErrors.ToString();
}
}
viewmodel의 유효성 검사 클래스에서 "Head"속성에 대해 정의 된 유효성 검사 규칙을 다시 사용하여 viewmodel 속성 "Head"에 대한 규칙으로 표시합니다. 보시다시피, 제가 자주 할 일을위한 코드가 꽤 많이 있습니다. 유창한 검증 프레임 워크 기능을 사용하여이 "유효성 검사 계획"을 설정할 수 있습니까?
당신이있으세요? 관심이 있으십니까? – Schotime
생성 한 확장 방법을 보여줄 수 있습니까? –