Метаданные с самоутверждением с использованием блока приложения проверки - PullRequest
3 голосов
/ 10 сентября 2010

Можно ли использовать атрибут selfvalidation с моими валидациями, расположенными в метадатипе? Я использую блок приложения проверки библиотеки Enterprise Library 5.

Ответы [ 2 ]

2 голосов
/ 12 сентября 2010

Как я объяснил в моем другом ответе, это не поддерживается "из коробки".Однако этого можно достичь, подключившись к платформе с помощью внедрения зависимостей и заменив существующую реализацию AttributeValidatorFactory.Я написал в своем блоге сообщение о том, как это сделать: Смешивание блока приложения проверки с аннотацией данных: как насчет SelfValidation?

Надеюсь, это поможет.

1 голос
/ 11 сентября 2010

Это в настоящее время не поддерживается (из коробки) 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 и заменить его версией, которая может это сделать.Это будет нелегко.

Приветствия

...