我正在写一个Web Api。我已经厌倦了总是检查一个模型是否有效,并且始终使用knitr
和try
子句的方法。出于这个原因,我写了一个方法catch
来做到这一点。它异步工作。
以下是适用的代码:
Try
我的问题是:是否有可能使这更短,更简单,更清晰?我仍然不喜欢这条丑陋的大线:
[Route("account/[controller]")]
public class LoginController : Controller
{
private static async Task<Status> Try(ModelStateDictionary modelState, Func<Task<Status>> func)
{
try
{
return modelState.IsValid ? await func() : Status.InvalidFormat;
}
catch
{
return Status.InvalidFormat;
}
}
[HttpPost]
public async Task<Status> Login(AccountLoginModel model)
=> await Try(ModelState, async () =>
{
// yaaay! i'm safe! the model is valid!
// and if something bad happens, an exception will be caught!!
// now let's do something...
return await Task.FromResult(Status.OK);
});
}
我可以做些什么来改善这段代码?或者是否有任何可以实施的结构可以完成工作?
修改
我的版本:
public async Task<Status> Login(AccountLoginModel model)
=> await Try(ModelState, async () =>
答案 0 :(得分:1)
您可以使用验证过滤器并注册过滤器以检查模型验证,如下所示:
public class ValidationFilter : ActionFilterAttribute
{
/// <summary>
/// Occurs before the action method is invoked.
/// </summary>
/// <param name="actionContext">The action context.</param>
public override void OnActionExecuting(HttpActionContext actionContext)
{
if (!actionContext.ModelState.IsValid)
{
actionContext.Response = actionContext
.Request
.CreateErrorResponse(HttpStatusCode.BadRequest, actionContext.ModelState);
}
}
}
在您的WebApiConfig Register方法中,您应该像这样注册验证过滤器:
config.Filters.Add(validationFilter);