Я хочу построить объектную модель, которая автоматически подключается при проверке, когда я пытаюсь сохранить объект.Я использую 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());
}
}