问题
是否可以让验证应用程序 block 的 Validation.Validate()
方法将 Unity 提供的 IParameterCollection
的每个参数视为我的自定义 UserModel
?
背景:
我正在尝试使用 Unity 和验证应用程序 block 来验证方法参数。
我希望能够将方法表示为 [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
。
问题
是否可以让验证应用程序 block 的 Validation.Validate()
方法将 Unity 提供的 IParameterCollection
的每个参数视为我的自定义 UserModel
?
最佳答案
您需要使用 ValidationFactory
而不是 Validation
类。当您替换此行时:
var results = Validation.Validate(parameter);
使用以下行,您可以让它工作。
var results =
ValidationFactory.CreatValidator(parameter.GetType())
.Validate(parameter);
祝你好运。
关于c# - 使用 Unity 框架和验证应用程序 block 验证方法参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2562976/