使用 Mediator 时的 C# 版本控制 API 控制器

问题描述 投票:0回答:1

我们想要对 C# API 控制器进行版本控制,有一些选项可以使用,例如

[ApiVersion("1.0")]
Public AccountController : ControllerBase 

或在具有相同注释的特定端点上。

我们遇到的问题是我们的控制器使用Mediator,那么如何以版本控制的方式对Mediator命令/请求进行重大更改?我们是否将版本号传递给所有中介器方法并在其中创建代码路径?我们是否重复任何损坏的调解器方法?

[ApiVersion("1.0")]
[HttpGet("")]
public async Task<IActionResult> Get(){
var result = await Mediator.Send(new GetInfoRequest());
return Ok(result);
}

[ApiVersion("2.0")]
[HttpGet("")]
public async Task<IActionResult> Get(){
var result = await Mediator.Send(new GetInfoRequestV2());
return Ok(result);
}
c# api mediator
1个回答
0
投票

对 C# API 控制器进行版本控制时,一种方法是将版本号传递给所有 Mediator 方法并相应地处理其中的代码路径。或者,您可以复制任何受影响的 Mediator 方法以适应重大更改。这是您可以看一下的示例:

方法 1:将版本号传递给中介方法

[ApiVersion("1.0")]
[HttpGet("")]
public async Task<IActionResult> Get()
{
    var result = await Mediator.Send(new GetInfoRequest() { Version = "1.0" });
    return Ok(result);
}

[ApiVersion("2.0")]
[HttpGet("")]
public async Task<IActionResult> Get()
{
    var result = await Mediator.Send(new GetInfoRequest() { Version = "2.0" });
    return Ok(result);
}

在调解器处理程序中,您将检查版本号并根据传递的版本执行适当的逻辑:

public class GetInfoRequestHandler : IRequestHandler<GetInfoRequest, InfoResponse>
{
    public async Task<InfoResponse> Handle(GetInfoRequest request, CancellationToken cancellationToken)
    {
        // Check the version number and execute the appropriate logic
        if (request.Version == "1.0")
        {
            // Handle API version 1.0 logic here
        }
        else if (request.Version == "2.0")
        {
            // Handle API version 2.0 logic here
        }
        else
        {
            // Handle unsupported version
        }
    }
}

方法 2:为不同版本复制中介方法

[ApiVersion("1.0")]
[HttpGet("")]
public async Task<IActionResult> Get()
{
    var result = await Mediator.Send(new GetInfoRequestV1());
    return Ok(result);
}

[ApiVersion("2.0")]
[HttpGet("")]
public async Task<IActionResult> Get()
{
    var result = await Mediator.Send(new GetInfoRequestV2());
    return Ok(result);
}

在此方法中,每个版本都有单独的请求类(GetInfoRequestV1、GetInfoRequestV2 等),以及相应的处理程序来根据请求的版本单独处理请求。这使代码路径保持分离并避免处理程序中的条件逻辑。

根据您想要的风格,您可以根据需求和可维护性问题选择最适合您和您的团队的方法。两种方法都有其优点和缺点,因此请根据您的具体用例和未来的发展计划来评估它们。

© www.soinside.com 2019 - 2024. All rights reserved.