在 API 版本控制中处理多个版本

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

使用 C# 和 .net 6

我已经在我们的应用程序中实现了 API 版本控制,但对实现有一些疑问,并且需要有关代码适当可维护性的建议。 并非我们的整个控制器都需要版本控制,因此我们实现了方法级别版本控制,如下所示:

[HttpGet]
[Route("getProfileData")]
[MapToApiVersion("1.0")]
[MapToApiVersion("2.0")]
public async Task<ActionResult> GetProfileData(string? userName,ApiVersion apiAppVersion)
{
    try
    {
         var apiVersion = apiAppVersion.MajorVersion ?? 1;
         var profileData = await profileService.GetProfileData(userName, apiVersion);
         //more code
    }
    catch (Exception ex)
     {
     }  
}   

在我们的服务层中,我们正在执行以下操作(请忽略确切的语法):

public async Task<Object> GetProfileData(string userName, int apiAppVersion)
{
    switch (apiVersion)
    {
     case 1:
     var userList = await myService.Query<Mapping>(query, CommandType.Text);
     var result = new
        {
            data = userList.where(x => x.UserName).Select(x => new UserDetailsVersion1
            {
                UserName = x.FirstOrDefault().UserName
            })
        };
        return result;   
     case 2:
      var userList = await myService.Query<Mapping>(query, CommandType.Text);
     var result = new
        {
            data = userList.where(x => x.UserName).Select(x => new UserDetailsVersion2
            {
                UserName = x.FirstOrDefault().UserName
            })
        };
        return result;   
    } 
}

现在,如果您看到上述方法,我对上述实现有两个问题:

  1. 我正在使用 switch 语句在两个版本之间切换。我们会有新版本 将来,一些旧版本将被弃用。这是正确的方法吗?或者是否有一个优雅的解决方案来处理这个问题。

  2. 案例 1 使用 UserDetailsVersion1,而案例 2 使用 UserDetailsVersion2。因为我们不希望在 UserDetailsVersion2 中添加额外的字段作为 UserDetailsVersion1 响应的一部分,所以我必须创建一个单独的实体来处理这种情况。同样,如果可以提供有关如何处理这种情况的任何意见,因为这会导致可维护性问题。

谢谢

c# asp.net-core swagger versioning aspnet-api-versioning
1个回答
0
投票

我在这里不太确定,但使用 .Net 8 创建第二个 API,然后添加到源代码控制,并删除 API 的第一次迭代,因为它将不再受支持(最终),这不是更好吗

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