هل ستعمل XVAL إذا تم تعريف السمات على واجهات؟
-
16-09-2019 - |
سؤال
أتساءل عما إذا كان أي شخص يعرف ما إذا كان XVAL سيعمل كما هو متوقع إذا قمت بتحديد سمات SystemBons.componentModel.Dataannotations على الواجهات التي يتم تنفيذها بواسطة فئات النموذج الخاصة بي، بدلا من فئات النماذج المخرجة مباشرة.
public interface IFoo
{
[Required] [StringLength(30)]
string Name { get; set; }
}
ثم في فئة نموذجي لن يكون هناك أي سمات التحقق من الصحة ...
public class FooFoo : IFoo
{
public string Name { get; set; }
}
إذا حاولت التحقق من صحة Foofoo مع XVAL، فهل سيتم استخدام AttesIbs من واجهةها؟
المحلول
في الوقت الحالي xVal.RuleProviders.DataAnnotationsRuleProvider
ينظر فقط إلى الممتلكات المحددة على الطبقة النموذجية نفسها. يمكنك أن ترى هذا في الطريقة GetRulesFromProperty
في فئة قاعدة مقدم القاعدة PropertyAttributeRuleProviderBase
:
protected virtual IEnumerable<Rule> GetRulesFromProperty(
PropertyDescriptor propertyDescriptor)
{
return from att in propertyDescriptor.Attributes.OfType<TAttribute>()
from validationRule in MakeValidationRulesFromAttribute(att)
where validationRule != null
select validationRule;
}
ال propertyDescriptor
المعلمة تمثل خاصية في فئة النموذج الخاصة بك و Attributes
الممتلكات تمثل فقط السمات المحددة مباشرة على الممتلكات نفسها.
ومع ذلك، يمكنك التمديد بالطبع DataAnnotationsRuleProvider
وتجاوز الأسلوب المناسب لجعله يفعل ما تريد: استخراج سمات التحقق من الصحة من الواجهات المنفذة. يمكنك بعد ذلك تسجيل مزود القاعدة الخاص بك مع XVAL:
ActiveRuleProviders.Providers.Clear();
ActiveRuleProviders.Providers.Add(new MyDataAnnotationsRuleProvider());
ActiveRuleProviders.Providers.Add(new CustomRulesProvider());
للحصول على سمات من الخصائص في الواجهات المنفذة، يجب أن تمتد DataAnnotationsRuleProvider
وتجاوز GetRulesFromTypeCore
. وبعد يحصل على معلمة من النوع System.Type
هذا له طريقة GetInterfaces
.