使用Unity Framework和验证应用程序块验证方法参数

Pau*_*man 6 c# validation enterprise-library unity-container validation-application-bl

Validation.Validate()验证应用程序块的方法是否可以将IParameterCollectionUnity提供的每个参数视为我的自定义UserModel


背景:

我试图使用Unity和验证应用程序块来验证方法参数.

我希望能够[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; }
}
Run Code Online (Sandbox Code Playgroud)

我已经创建了一个自定义HandlerAttribute,它将启动对验证处理程序的调用,如图所示.

public class RequiresValidationAttribute : HandlerAttribute
{
  public override ICallHandler CreateHandler(IUnityContainer container)
  {
    return new ValidationCallHandler();
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,验证处理程序将尝试验证方法的每个参数:

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;

      // ...
    }

    // ...
  }
}
Run Code Online (Sandbox Code Playgroud)

问题

Validation.Validate()方法将始终返回true.根据我的观察,似乎验证逻辑将处理parameter为一个object而不是我的UserModel.


Validation.Validate()验证应用程序块的方法是否可以将IParameterCollectionUnity提供的每个参数视为我的自定义UserModel

Ste*_*ven 2

您将需要使用ValidationFactory代替类Validation。当您替换此行时:

var results = Validation.Validate(parameter);
Run Code Online (Sandbox Code Playgroud)

使用以下行,您可以让它工作。

var results =
    ValidationFactory.CreatValidator(parameter.GetType())
        .Validate(parameter);
Run Code Online (Sandbox Code Playgroud)

祝你好运。