使用 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;
}
}
现在,如果您看到上述方法,我对上述实现有两个问题:
我正在使用 switch 语句在两个版本之间切换。我们会有新版本 将来,一些旧版本将被弃用。这是正确的方法吗?或者是否有一个优雅的解决方案来处理这个问题。
案例 1 使用 UserDetailsVersion1,而案例 2 使用 UserDetailsVersion2。因为我们不希望在 UserDetailsVersion2 中添加额外的字段作为 UserDetailsVersion1 响应的一部分,所以我必须创建一个单独的实体来处理这种情况。同样,如果可以提供有关如何处理这种情况的任何意见,因为这会导致可维护性问题。
谢谢
我在这里不太确定,但使用 .Net 8 创建第二个 API,然后添加到源代码控制,并删除 API 的第一次迭代,因为它将不再受支持(最终),这不是更好吗