.net 使用IResult作为“经典”API而不是Minimal API的返回值

kxxlusnw  于 2022-12-14  发布在  .NET
关注(0)|答案(3)|浏览(131)

我有多个返回IResult的服务,不想使用最小API结构,但我想使用相同的返回类型IResult,但当我在控制器中使用它时,它总是返回Ok:
返回400错误请求的最小API示例:

app.MapPut("test", async () =>
{
    return Results.BadRequest("hello");
});

返回200 Ok的经典控制器:

[ApiController]
public class TestController : ControllerBase

    [HttpPut("test")]
    public async Task<IResult> Test()
    {
        return Results.BadRequest();
    }

有没有简单的方法来解决这个问题,或者我需要一个Map函数?
我正在使用.NET 6。

wztqucjr

wztqucjr1#

从技术上讲,您可以在ControllerBase的上下文中调用IResult.ExecuteAsync

public class SomeController : ControllerBase
{
    public async Task SomeAction()
    {
        IResult result = Results.BadRequest(); // dummy result, use one from the service
        await result.ExecuteAsync(HttpContext);
    }
}

但一般来说,最好遵循标准模式,在这种情况下,让您的服务返回一些定制的应用程序特定的响应,这是“平台不可知的”,即它不应该依赖于所使用的Web框架,并代表一些业务/域相关的实体/数据。例如FluentResults,或者使用某种Either(这里有许多选项CSharpFunctionalExtensionslanguage-extOptional等)来增加功能。

laik7k3q

laik7k3q2#

现在.NET 7支持此功能。

using Microsoft.AspNetCore.Mvc;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers();

var app = builder.Build();

app.MapControllers();

app.Run();

public class Home : ControllerBase
{
    [HttpGet("/")]
    public IResult Get() => Results.Ok("Okies");
}
2q5ifsrm

2q5ifsrm3#

[ApiController]
[Route("[controller]")]
public class TestController : ControllerBase
{
    [HttpPut]
    public IActionResult Test()
    {
        return BadRequest("...from Test...");
    }
}

点击它的URL是**/test**

相关问题