Циркулярное наследование для проверки - PullRequest
0 голосов
/ 24 декабря 2010

Я хочу построить объектную модель, которая автоматически подключается при проверке, когда я пытаюсь сохранить объект.Я использую DataAnnotations для своей проверки, и все это работает хорошо, но я думаю, что мое наследство повреждено.Я ищу здесь несколько советов о том, как лучше подключить мою проверку.

Итак, для создания проверки у меня есть этот интерфейс

public interface IValidatable
{
    bool IsValid { get; }
    ValidationResponse ValidationResults { get; }
    void Validate();
}

Затем у меня есть базовый класс, которыйвсе мои объекты наследуются от.Я провел урок, потому что хотел автоматически подключать проверочные вызовы.Проблема в том, что валидация должна знать тип класса, который он проверяет.Поэтому я использую Generics вот так.

public class CoreObjectBase<T> : IValidatable where T : CoreObjectBase<T>  
{
    #region IValidatable Members

    public virtual bool IsValid
    {
        get
        {
            // First, check rules that always apply to this type
            var result = new Validator<T>().Validate((T)this);

            // return false if any violations occurred
            return !result.HasViolations;
        }
    }

    public virtual ValidationResponse ValidationResults
    {
        get
        {
            var result = new Validator<T>().Validate((T)this);
            return result;
        }
    }

    public virtual void Validate()
    {
        // First, check rules that always apply to this type
        var result = new Validator<T>().Validate((T)this);

        // throw error if any violations were detected
        if (result.HasViolations)
            throw new RulesException(result.Errors);
    }

    #endregion
}

Итак, у меня есть это циклическое заявление о наследовании.Мои классы выглядят так:

public class MyClass : CoreObjectBase<MyClass>
{

}

Но проблема возникает, когда у меня более сложная модель.Поскольку я могу наследовать только от одного класса, когда у меня есть ситуация, когда наследование имеет смысл, я считаю, что дочерние классы не будут проверять свои свойства.

public class Parent : CoreObjectBase<Parent>
{
    //properties validated
}

public class Child : Parent
{
    //properties not validated?
}

Я действительно не проверял проверку втаких случаев пока нет, но я почти уверен, что все, что у ребенка с аннотацией данных, не будет автоматически проверяться при вызове Child.Validate ();из-за способа настройки наследования.Есть ли лучший способ сделать это?

РЕДАКТИРОВАТЬ:

Для дальнейшего разъяснения, вот мое подтверждение.Это использует System.ComponentModel.DataAnnotations.

public sealed class Validator<T> where T : CoreObjectBase<T>
{
    public ValidationResponse Validate(T entity)
    {
        var validationResults = new List<ValidationResult>();
        var context = new ValidationContext(entity, null, null);
        var isValid = Validator.TryValidateObject(entity, context, validationResults);

        return new ValidationResponse(validationResults.ToArray());
    }
}

1 Ответ

1 голос
/ 24 декабря 2010

Я не понимаю, почему вы используете наследование для этого - вы уже делегируете проверку внешнему классу (Validator<T>), поэтому вы сможете полностью отделить процесс проверки от целевого объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...