c# - 使用 Unity 框架和验证应用程序 block 验证方法参数

标签 c# validation unity-container enterprise-library validation-application-bl

问题

是否可以让验证应用程序 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/

相关文章:

javascript - 在验证模式中使用 isStrongPassword

c# - ASP.NET 自定义验证器 + WebMethod + jQuery

c# - Unity解析对象并在依赖解析对象中获取相同的对象

c# - TCP 客户端有时会合并数据包

c# - 适合 Unity 的抽象工厂

c# - 从 Random.NextBytes() 创建具有最小值和最大值的随机整数

c# - 仅安装更新的框架时应用程序会运行吗

php - 验证我的 PHP 表单并提交到数据库

c# - 使用 linq 从 select new 返回多行

c# - 如何在 Windows Phone 8.1 通用商店应用程序中正确导航后退堆栈