我試圖使用.NET DataAnnotations功能在派生類中提供簡單驗證時遇到了一點困難。我使用.NET 4中包含的標準註釋(來自System.ComponentModel.DataAnnotations命名空間)標記我的類,然後使用MS Enterprise Library v5驗證塊處理規則。DataAnnotations MetadataType類忽略基類屬性
我有一些從一個公共基類派生的對象,其中包含所有我的對象的共同屬性。出於驗證的目的,我可能對從這個類派生的各個類有不同的規則。
這裏有一個簡單的例子:
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提供的驗證屬性;如果可能的話,我寧願保持圖書館的生活不受外部核心框架的依賴。
我錯過了什麼,或者我只是在這裏運氣不好?