繁体   English   中英

IHttpActionResult确定无返回值的方法

[英]IHttpActionResult Ok for methods with no return

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

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

看起来很整洁,如果该方法有收益,效果很好。 但是,如果它是voidTask ,那么我将无法做到这一点。 我必须像这样将其分开:

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方法,但不确定是否可行,或者是否会增加应用程序的执行时间。 有谁知道这可以做到吗?

您自己提到了它-您可以为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));

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM