我们想要对 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 方法并相应地处理其中的代码路径。或者,您可以复制任何受影响的 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 等),以及相应的处理程序来根据请求的版本单独处理请求。这使代码路径保持分离并避免处理程序中的条件逻辑。
根据您想要的风格,您可以根据需求和可维护性问题选择最适合您和您的团队的方法。两种方法都有其优点和缺点,因此请根据您的具体用例和未来的发展计划来评估它们。