Я наткнулся на небольшую стену, пытаясь использовать функцию .NET DataAnnotations для обеспечения простых проверок в производном классе. Я размечаю свой класс стандартными аннотациями, включенными в .NET 4 (из пространства имен System.ComponentModel.DataAnnotations), затем использую блок проверки MS Enterprise Library v5 для обработки правил.
У меня есть ряд объектов, полученных из общего базового класса, который содержит свойства, общие для всех моих объектов. В целях проверки у меня могут быть разные правила для различных классов, производных от этого класса.
Вот упрощенный пример:
public abstract class PersonBase
{
public int Id { get; set; }
public string Name { get; set; }
}
[MetadataType(typeof(CustomerMD))]
public class Customer : PersonBase
{
}
[MetadataType(typeof(ManagerMD))]
public class Manager : PersonBase
{
}
public class CustomerMD
{
[Required]
[StringLength(20, ErrorMessage="Customer names may not be longer than 20 characters.")]
public object Name { get; set; }
}
public class ManagerMD
{
[Required]
[StringLength(30, ErrorMessage = "Manager names may not be longer than 30 characters.")]
public object Name { get; set; }
}
// calling code
var invalidCustomer = new Customer {Id=1, Name=string.Empty};
var valFactory = EnterpriseLibraryContainer.Current.GetInstance<ValidatorFactory>();
var customerValidator = valFactory.CreateValidator<Customer>();
var validationResults = customerValidator.Validate(invalidCustomer);
// validationResults.IsValid should equal False, but actually equals True.
Я обнаружил, что могу получить ожидаемые результаты проверки, если переместу аннотации к базовому классу, но тогда я потеряю способность выполнять разные требования для разных типов. Кроме того, если я добавлю специфичные для класса свойства в производный класс и предоставлю метаданные для этих свойств, я получу результаты, но только для этих свойств, а не для свойств базового класса.
Я еще не пробовал использовать предоставленные EntLib атрибуты проверки; Я бы предпочел сохранить библиотеку, в которой она живет, без зависимостей вне базовой структуры, если это вообще возможно.
Я что-то упустил или мне просто не повезло?