Типы метаданных с самопроверкой с использованием блока приложения проверки

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


person Scott Williams    schedule 10.09.2010    source источник


Ответы (2)


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

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

person Steven    schedule 12.09.2010
comment
Спасибо Стивен за такой подробный ответ; это сработало отлично! Больше всего меня беспокоило разделение нашей бизнес-логики и проверки, и я был немного разочарован, когда подумал, что мне придется переместить все это обратно в класс экземпляра. Кроме того, я не знал, что могу вводить типы в EL с помощью Unity; Я благодарен, что ты показал мне это. - person Scott Williams; 13.09.2010
comment
@Scott: Unity — это просто контейнер IoC по умолчанию для EntLib. На самом деле вы можете использовать любой контейнер, который вам нравится. - person Steven; 13.09.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 и заменить его версией, которая может это сделать. Хотя это будет нелегко.

Ваше здоровье

person Steven    schedule 11.09.2010
comment
В EntLib 5.0 вам действительно нужно поместить [HasSelfValidation] в класс InvoiceMetaData, а не в класс Invoice, если вы смешиваете классы метаданных и самопроверку. VAB, похоже, игнорирует дополнительные атрибуты класса, который имеет атрибут [MetadataType]. - person Andreas H.; 14.10.2011