[英]IHttpActionResult Ok for methods with no return
好的,这要么是“无法完成”,要么很容易回答。 我喜欢这样使用1行返回:
public async Task<IHttpActionResult> ChangePassword(ChangePasswordRequestModel model) => Ok(await this.UserProvider.ChangePasswordAsync(model, User.Identity));
看起来很整洁,如果该方法有收益,效果很好。 但是,如果它是void或Task ,那么我将无法做到这一点。 我必须像这样将其分开:
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.