Я реализовал управление версиями API в нашем приложении, но у меня мало вопросов относительно реализации, и мне нужны предложения по правильному сопровождению кода.
Нет всему нашему контроллеру требуется управление версиями, поэтому мы реализовали управление версиями на уровне метода, как показано ниже:
Код: Выделить всё
[HttpGet]
[Route("getProfileData")]
[MapToApiVersion("1.0")]
[MapToApiVersion("2.0")]
public async Task 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 GetProfileData(string userName, int apiAppVersion)
{
switch (apiVersion)
{
case 1:
var userList = await myService.Query(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(query, CommandType.Text);
var result = new
{
data = userList.where(x => x.UserName).Select(x => new UserDetailsVersion2
{
UserName = x.FirstOrDefault().UserName
})
};
return result;
}
}
- Я использую оператор переключения для переключения между двумя версиями. В будущем у нас будут новые версии
, в то время как некоторые из старых версий станут устаревшими. Это правильный способ сделать или есть элегантное решение для этой проблемы. - Case1 использует UserDetailsVersion1 в то время как Case2 использует UserDetailsVersion2. Поскольку мы не хотим, чтобы дополнительные поля добавлялись в UserDetailsVersion2 как часть ответа для UserDetailsVersion1, поэтому мне пришлось создать отдельный объект для обработки такого сценария. Опять же, если можно предоставить какую-либо информацию о том, как справиться с таким сценарием, поскольку это приведет к проблемам с удобством обслуживания.
Подробнее здесь: https://stackoverflow.com/questions/792 ... versioning