Поддержка нескольких версий для API веб-сервиса
От: andyag  
Дата: 06.08.13 12:50
Оценка:
Есть некое клиент-серверное приложение (оригинально, да). Предполагается раз в 2 недели выпускать новую версию. Если серверную часть технически обновить вполне легко, клиентская часть обновляется по желанию пользователей — могут и вообще не обновлять 2 месяца. После удара головой об стену возникла нездоровая мысль — с выпуском каждой новой версии тупо делать полную копию API — интерфейсы и DTO:

Версия 1:
public interface IApiV1
{
  ThingDTOV1 GetThing(int thingId)
}

public class ThingDTOV1
{
  public int ThingId { get; set; }
  public string ThingDescription { get; set; }
}


Версия 2 начинается с полной копии V1:
public interface IApiV2
{
  ThingDTOV2 GetThing(int thingId)
}

public class ThingDTOV2
{
  public int ThingId { get; set; }
  public string ThingDescription { get; set; }
}


А продолжается деланьем абсолютно любых правок:
public interface IApiV2
{
  ThingDTOV1 GetThing(string token, int thingId) // API поменялся
}

public class ThingDTOV2
{
  public int ThingId { get; set; } // это так и было
  public string Description { get; set; } // отрефакторили
  public string ExtendedDescription { get; set; } // добавили новое
}


При релизе старый API делается доступным по адресу /v1, новый — по адресу /v2. Старые клиенты работают только со старым, новые — только с новым. Детали реализации (по возможности) изолированы и используются (по возможности) всеми версиями. С выходом каждой новой версии убивать одну самую старую — например гарантировать доступность 10 последних версий. В результате копипаст не разрастается, а ограничен "размером" обратной совместимости.

Подскажите пожалуйста какие могут быть подводные камни.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.