Как выполнить проверку модели унаследованного класса, когда его базовый класс также имеет проверку? - PullRequest
0 голосов
/ 06 января 2019

Что ж, моя проблема в том, что я создаю API, используя aspnetcore 2.1, чтобы избежать дублирования кода, я создал абстрактный класс со свойствами, которые разделяют dtos (board, boardforcreation, boardforupdate и т. Д.). Я добавил к абстрактному классу персонализированную проверку с использованием ivalidatableobject, теперь я хочу добавить персонализированную проверку к классам, производным от абстрактного класса, но он говорит мне, что расширение из интерфейса ivalidatableobject является избыточным, поскольку оно уже было объявлено в базовом классе, а также когда я добавляю метод Validate в производный класс, он говорит мне, что он уже объявлен и реализован, тогда как я могу добавить проверку в абстрактном классе и в производном классе, используя ivalidatableobject? или есть другой способ добиться этого. Заранее спасибо.

public class Board : BoardAbstractBase, IValidatableObject
{
    public Guid BoardId { get; set; }

    public DateTimeOffset StartDate { get; set; }

    public DateTimeOffset EndDate { get; set; }  
}

public abstract class BoardAbstractBase : AbstractBasicEntity, IValidatableObject
{
    public DateTimeOffset EstimatedStartDate { get; set; }


    public DateTimeOffset EstimatedEndDate { get; set; }


    public decimal EstimatedBudget { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (!(EstimatedStartDate < EstimatedEndDate))
            yield return new ValidationResult(
                "StartDateBeforeEndDate|The estimated start date should be smaller than the end date.",
                new[] {"BoardAbstractBase"});
    }
}

1 Ответ

0 голосов
/ 06 января 2019

Добавьте виртуальный метод к базовому классу.

Если вы хотите выполнить некоторую общую логику проверки в базовом классе, а также выполнить дополнительную логику проверки в каждой из конкретных реализаций, то добавьте метод виртуальной проверки в ваш базовый класс, который вызывается в функции проверки базового класса.

Добавить в базовый класс:

public abstract class BoardAbstractBase {
    ...
    protected virtual bool RepoValidate() {
        return true;
    }
    ...
}

Затем в каждой конкретной реализации реализуйте RepoValidate с любой необходимой вам логикой проверки, например protected override bool RepoValidate() {...}.

Например

public class Board : BoardAbstractBase, IValidatableObject
{
    ...
    protected override bool RepoValidate() { 
        return this.BoardId == "";
    }
    ...
}

Затем в BoardAbstractBase.Validate:

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (!(EstimatedStartDate < EstimatedEndDate))
            yield return new ValidationResult(
                "StartDateBeforeEndDate|The estimated start date should be smaller than the end date.",
                new[] {"BoardAbstractBase"});

        if (!this.RepoValidate()){ ... }
    }

Теперь вы всегда можете изменить RepoValidate, чтобы он возвращал результат проверки, если он потерпел неудачу, или принимает какой-либо аргумент, но просто для примера, этот просто возвращает false. Кроме того, поскольку это virtual, а не abstract, вам нужно переопределить его, только когда у вас есть дополнительная настраиваемая логика для выполнения.

...