制作通用体方法

时间:2015-06-02 16:30:15

标签: c# .net asp.net-web-api

我正在写一个Web Api。我已经厌倦了总是检查一个模型是否有效,并且始终使用knitrtry子句的方法。出于这个原因,我写了一个方法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 () =>

1 个答案:

答案 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);