Можно ли использовать атрибут самопроверки с моими проверками, расположенными в типе метаданных? Я использую блок приложения проверки Enterprise Library 5.
Типы метаданных с самопроверкой с использованием блока приложения проверки
Ответы (2)
Как я объяснил в своем другом ответе, это не поддерживается из коробки. Однако этого можно добиться, подключившись к фреймворку с помощью внедрения зависимостей и заменив существующую реализацию AttributeValidatorFactory
. Я написал сообщение в своем блоге о том, как это сделать: Приложение для проверки микширования Блокировка с помощью DataAnnotation: как насчет самопроверки?
Надеюсь, это поможет.
В настоящее время это не поддерживается (из коробки) VAB. Посмотрите, например, на эту тему на форуме EntLib. Я думаю, что основная причина, по которой это не поддерживается, заключается в том, что вы не можете просто поместить метод [SelfValidation] в тип метаданных и ожидать, что это сработает. Причина, по которой это не сработает, заключается в том, что методы самопроверки обычно проверяют члены экземпляра типа. Сигнатура метода самопроверки не содержит фактического объекта для проверки.
Простым обходным решением является вызов типа метаданных из объекта. Например:
[MetadataType(typeof(InvoiceMetaData))]
[HasSelfValidation]
public partial class Invoice
{
public string Name{ get; set; }
public int Price { get; set; }
[SelfValidation]
public void CustomValidate(ValidationResults results)
{
// Call into the meta data class
InvoiceMetaData.Validate(this, results);
}
}
public class InvoiceMetaData
{
[StringLengthValidator(1, 10, Tag = "Name")]
string Name { get; set; }
[RangeValidator(0, RangeBoundaryType.Inclusive, 0,
RangeBoundaryType.Ignore, Tag = "Price")]
int Price { get; set; }
public static void CustomValidate(Invoice instance,
ValidationResults results)
{
results.AddResult(new ValidationResult("ErrorMessage1",
instance, "", "", null));
}
}
Это, конечно, не очень чистое решение. Однако VAB очень расширяемый, и версия 5.0 стала еще лучше. Если вы хотите, вы можете поменять местами существующий AttributeValidationFactory
и заменить его версией, которая может это сделать. Хотя это будет нелегко.
Ваше здоровье