IHttpActionResult对于没有返回的方法没问题

时间:2016-11-17 12:08:59

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

好的,这将是“无法完成”或者很容易回答。 我喜欢使用这样的1行返回:

public async Task<IHttpActionResult> ChangePassword(ChangePasswordRequestModel model) => Ok(await this.UserProvider.ChangePasswordAsync(model, User.Identity));

看起来很漂亮,如果方法有回报,效果很好。但如果它是无效任务,那么我不能这样做。 我必须将它分开:

public async Task<IHttpActionResult> ResendConfirmationEmailAsync(ResendConfirmationRequestModel model)
{

    // Execute first
    await this.UserProvider.ResendConfirmationEmailAsync(model.UserId, model.CallbackUrl);

    // Return
    return Ok();
}

当然,这让我感到烦恼,我想这样做:

public async Task<IHttpActionResult> ResendConfirmationEmailAsync(ResendConfirmationRequestModel model) => Ok(await this.UserProvider.ResendConfirmationEmailAsync(model.UserId, model.CallbackUrl));

我正在考虑创建自己的 IHttpActionResult Ok方法,但我不确定这是否可行或是否会为我的应用程序增加额外的执行时间。 有谁知道这是否可以做到?

2 个答案:

答案 0 :(得分:2)

您自己提到了 - 您可以为Ok创建重载。

下面是一个完整的例子。我个人认为单行返回更具可读性。但它的确有效。并且,它会增加一些开销,因为下面的解决方案使用Action来处理void方法。但可以完成 ...此外,await await-part显示了一些代码味道。

为清楚起见,我调用了我的方法MyOk,而不是实际覆盖Ok

public class FooController : ApiController
{
    [HttpGet]
    public async Task<IHttpActionResult> DoStuffWithTask() => await MyOk(async () => await FooWithTask());

    //[HttpGet]
    public async Task<IHttpActionResult> DoStuffWithVoid() => await MyOk(() => FooWithVoid());

    public async Task<IHttpActionResult> DoAsync()
    {
        return await MyOk(FooWithTask());
    }


    private async Task<IHttpActionResult> MyOk(Task task)
    {
        await task;
        return Ok();
    }

    private async Task<IHttpActionResult> MyOk(Action stuff)
    {
        stuff();
        return Ok();
    }

    public void FooWithVoid()
    {
        // Do Stuff!
    }

    public async Task FooWithTask()
    {
        // Do Stuff!
        return;
    }
}

使用您的代码:

 public async Task<IHttpActionResult> ResendConfirmationEmailAsync(ResendConfirmationRequestModel model) => await MyOk(async () => await this.UserProvider.ResendConfirmationEmailAsync(model.UserId, model.CallbackUrl));

答案 1 :(得分:0)

=>启动C#6.0 expression bodied function。这意味着你需要=>右侧的表达式。您的方法体有多个语句。由于您无法将此语句块转换为表达式,因此无法创建表达式 bodied函数。