是否有任何声明性方式来检查 C# REST 服务控制器中输入参数的有效性?

Posted

技术标签:

【中文标题】是否有任何声明性方式来检查 C# REST 服务控制器中输入参数的有效性?【英文标题】:Is there any declarative way to check validity of input parameters in C# REST service controllers? 【发布时间】:2020-09-24 23:55:17 【问题描述】:

假设我有一个具有以下方法的控制器类

public async Task<XYZ> ProcessSomeAPICall(User u, int a, string b, bool c) 
    if (u.Name == "Bubba" && a < 10) 
        throw new BubbaException("there is no way Bubba can do more then 10")
    

    if (u.Position == null && !c) 
        throw new EmploymentException("user without a job should have c set up")
    

    //... more input parameter checks here

    return await executeSomeApplicationLogic(u, a, b, c);

是否有任何框架可以帮助我最大限度地减少执行参数检查所需编写的条件代码的数量?

【问题讨论】:

【参考方案1】:

您可以使用 FluentValidation 来验证您的输入并提高可读性。

 public class UsersController : ControllerBase

    public async Task<XYZ> ProcessSomeAPICall(RegisterUserCommand command)  // command => user in your sample
    
        command.Validate();
    


public class RegisterUserCommand

    public string UserName  get; set; 
    // some properties

    public void Validate()
    
        new RegisterUserCommandValidator().Validate(this).RaiseExceptionIfNeed();
    


public class RegisterUserCommandValidator : AbstractValidator

    public RegisterUserCommandValidator()
    
        RuleFor(p=> p.UserName).NotEmpty().NotNull().WithMessage("some-message");
    

【讨论】:

以上是关于是否有任何声明性方式来检查 C# REST 服务控制器中输入参数的有效性?的主要内容,如果未能解决你的问题,请参考以下文章

Servlet 过滤器(自动登录)优先于声明性安全检查

C#:如何以编程方式检查 Web 服务是不是已启动并正在运行?

是否有专业的方式来规划您的 REST API?

是否有在 Android 上创建选项卡式布局的声明性方式?

C# REST PayPal API - 如何传递自定义变量?

在 REST 服务中返回真/假?