2010-07-27 1 views
1

도메인 객체 인 데이터 소스를 캡슐화하는 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"에 대한 규칙으로 표시합니다. 보시다시피, 제가 자주 할 일을위한 코드가 꽤 많이 있습니다. 유창한 검증 프레임 워크 기능을 사용하여이 "유효성 검사 계획"을 설정할 수 있습니까?

답변

0

프레임 워크에서이 작업을 수행 할 방법을 찾지 못했습니다. 단 한 번의 라이너로 수행 할 수있는 확장 방법을 만들었습니다.

예 :이 어디서든 작업을 얻었는지

class PumpCurveViewModelValidationRules : AbstractValidator<PumpCurveViewModel> 
{ 
    readonly ConstantPumpCurveParametersValidationRules _constantParametersValidator = new ConstantPumpCurveParametersValidationRules(); 

    public PumpCurveViewModelValidationRules() 
    { 
     this.AddPropertyProjectionRule<PumpCurveViewModelValidationRules, PumpCurveViewModel, ConstantPumpParameters>(c => c.Speed, vm => vm.CurveSpeed, vm => vm.DataSource.ConstantPumpParameters, _constantParametersValidator);   
    } 
} 
+0

당신이있으세요? 관심이 있으십니까? – Schotime

+0

생성 한 확장 방법을 보여줄 수 있습니까? –