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

Вопрос

Действительно ли возможно иметь Validation.Validate() метод Блока приложений Проверки видит каждый параметр IParameterCollection предоставленный Единицей как мое пользовательское UserModel?


Фон:

Я пытаюсь использовать и Единицу и Блок приложений Проверки для проверки параметров метода.

Я хотел бы смочь обозначить метод как [RequiresValidation()] и параметры того метода с соответствующими атрибутами проверки.

Так, что-то вроде этого:

[RequiresValidation()]
public void SaveUser(UserModel user)
{
  // ...
}

public class UserModel
{
  [StringLengthValidator(3, 255)]
  [RegexValidator(@"^[a-zA-Z0-9]${3,255}")]
  public string Name { get; set; }

  [StringLengthValidator(0, 255)]
  [RegexValidator(@"\b[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b")]
  public string EMail { get; set; }
}

Я создал пользовательский HandlerAttribute, который будет инициировать вызов к обработчику проверок как показано.

public class RequiresValidationAttribute : HandlerAttribute
{
  public override ICallHandler CreateHandler(IUnityContainer container)
  {
    return new ValidationCallHandler();
  }
}

Теперь, Обработчик Проверок попытается проверить каждый параметр метода:

public class ValidationCallHandler : ICallHandler
{
  public int Order { get; set; }

  public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
  {            
    // Validate the method parameters
    ValidateArguments(input.Arguments);

    // Call the method that was intercepted
    return getNext()(input, getNext);
  }

  private static void ValidateArguments(IParameterCollection parameterCollection)
  {
    foreach (var parameter in parameterCollection)
    {
      var results = Validation.Validate(parameter);
      if (results.IsValid) continue;

      // ...
    }

    // ...
  }
}

Проблема

Validation.Validate() метод будет всегда возвращать true. На основе моих наблюдений кажется, что логика проверки рассматривает parameter как object и не мой UserModel.


Вопрос

Действительно ли возможно иметь Validation.Validate() метод Блока приложений Проверки видит каждый параметр IParameterCollection предоставленный Единицей как мое пользовательское UserModel?

6
задан Steven 31 August 2010 в 07:57
поделиться

1 ответ

Вам нужно будет использовать ValidationFactory вместо класса Validation . Когда вы заменяете эту строку:

var results = Validation.Validate(parameter);

следующей строкой, вы можете заставить ее работать.

var results =
    ValidationFactory.CreatValidator(parameter.GetType())
        .Validate(parameter);

Удачи.

2
ответ дан 17 December 2019 в 20:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: