using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; namespace AsbCloudApp.Data; /// /// Плановое значение и максимально допустимое ограничение /// public class PlanLimitDto { /// /// План /// [Required] public double Plan { get; set; } /// /// Максимальное ограничение /// [Required] public double LimitMax { get; set; } /// /// Валидация /// /// Общий диапазон для плана и ограничения /// /// public virtual IEnumerable Validate((double GE, double LE) commonRange, string paramName) => Validate(commonRange, commonRange, paramName); /// /// Валидация /// /// /// /// Название параметра для которого задается план и ограничение /// public virtual IEnumerable Validate((double GE, double LE) planRange, (double GE, double LE) limitMaxRange, string paramName) { if (Plan < planRange.GE || Plan > planRange.LE) yield return new ValidationResult($"{paramName} плановое значение должно быть в диапазоне [{planRange.GE}; {planRange.LE}]."); if (Plan < planRange.GE || Plan > planRange.LE) yield return new ValidationResult($"{paramName} ограничивающее значение должно быть в диапазоне [{limitMaxRange.GE}; {limitMaxRange.LE}]."); } } /// /// Реализация RangeAttribute для PlanLimitDto /// [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)] public class RangePlanLimitAttribute : ValidationAttribute { private readonly double minimum; private readonly double maximum; /// /// Реализация RangeAttribute для PlanLimitDto /// /// /// public RangePlanLimitAttribute(double minimum, double maximum) { this.minimum = minimum; this.maximum = maximum; } /// public override bool IsValid(object? value) { try { if(value is PlanLimitDto dto) { var isPlanValid = dto.Plan <= maximum && dto.Plan >= minimum; var isLimitMaxValid = dto.LimitMax <= maximum && dto.LimitMax >= minimum; return isPlanValid && isLimitMaxValid; } }catch{} return false; } }