Действительно ли возможно иметь 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
?
Вам нужно будет использовать ValidationFactory
вместо класса Validation
. Когда вы заменяете эту строку:
var results = Validation.Validate(parameter);
следующей строкой, вы можете заставить ее работать.
var results =
ValidationFactory.CreatValidator(parameter.GetType())
.Validate(parameter);
Удачи.