Проверка аргументов метода с помощью атрибутов аннотации данных - PullRequest
0 голосов
/ 03 июня 2010

Шаблон «Silverlight Business Application» в комплекте с VS2010 / Silverlight 4 использует DataAnnotations для аргументов метода в своем классе обслуживания домена, которые вызываются автоматически:

        public CreateUserStatus CreateUser(RegistrationData user,
        [Required(ErrorMessageResourceName = "ValidationErrorRequiredField", ErrorMessageResourceType = typeof(ValidationErrorResources))]
        [RegularExpression("^.*[^a-zA-Z0-9].*$", ErrorMessageResourceName = "ValidationErrorBadPasswordStrength", ErrorMessageResourceType = typeof(ValidationErrorResources))]
        [StringLength(50, MinimumLength = 7, ErrorMessageResourceName = "ValidationErrorBadPasswordLength", ErrorMessageResourceType = typeof(ValidationErrorResources))]
        string password)
    { /* do something */ }

Если мне нужно реализовать это в моих методах класса POCO, как мне заставить каркас вызывать валидацию ИЛИ как мне обязательно вызывать валидацию для всех аргументов (используя Validator или иным образом?).

1 Ответ

1 голос
/ 03 июня 2010

Мы подошли к этому так:

У нас есть класс ValidationProperty, который принимает выражение RegularExpression, которое будет использоваться для проверки значения (вы можете использовать все, что захотите).

ValidationProperty.cs

public class ValidationProperty
{
    #region Constructors

    /// <summary>
    /// Constructor for property with validation
    /// </summary>
    /// <param name="regularExpression"></param>
    /// <param name="errorMessage"></param>
    public ValidationProperty(string regularExpression, string errorMessage)
    {
        RegularExpression = regularExpression;
        ErrorMessage = errorMessage;
        IsValid = true;
    }

    #endregion

    #region Properties

    /// <summary>
    /// Will be true if this property is currently valid
    /// </summary>
    public bool IsValid { get; private set; }

    /// <summary>
    /// The value of the Property.
    /// </summary>
    public object Value 
    {
        get { return val; }
        set 
        {
            if (this.Validate(value))//if valid, set it
            {
                val = value;
            }
            else//not valid, throw exception
            {
                throw new ValidationException(ErrorMessage);
            }
        }
    }
    private object val;

    /// <summary>
    /// Holds the regular expression that will accept a vaild value
    /// </summary>
    public string RegularExpression { get; private set; }

    /// <summary>
    /// The error message that will be thrown if invalid
    /// </summary>
    public string ErrorMessage { get; private set; }

    #endregion

    #region Private Methods

    private bool Validate(object myValue)
    {
        if (myValue != null)//Value has been set, validate it
        {
            this.IsValid = Regex.Match(myValue.ToString(), this.RegularExpression).Success;
        }
        else//still valid if it has not been set.  Invalidation of items not set needs to be handled in the layer above this one.
        {
            this.IsValid = true;
        }

        return this.IsValid;
    }

    #endregion
}

Вот как мы должны создать свойство Validation. Обратите внимание, что открытый член является строкой, но в частном порядке я использую 'ValidationProperty.'

public string TaskNumber
    {
        get { return taskNumber.Value.ToString(); }
        set 
        {
            taskNumber.Value = value;
            OnPropertyChanged("TaskNumber");
        }
    }
    private ValidationProperty taskNumber;

Теперь, когда значение установлено, бизнес-уровень проверяет, является ли оно допустимым значением. Если это не так, он просто сгенерирует новое исключение ValidationException (в классе ValidationProperty). В вашем xaml вам нужно установить для параметра NotifyOnValidationError & ValidatesOnExceptions значение true.

<TextBox Text="{Binding TaskNumber, Mode=TwoWay, NotifyOnValidationError=True, ValidatesOnExceptions=True}"/>

При таком подходе у вас, вероятно, будет форма для создания нового пользователя, и каждое поле будет проверяться каждый раз, когда они его устанавливают (надеюсь, это имеет смысл).

Это подход, который мы использовали, чтобы получить валидацию на бизнес-уровне. Я не уверен, что это именно то, что вы ищете, но я надеюсь, что это поможет.

...