Есть некое клиент-серверное приложение (оригинально, да). Предполагается раз в 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 последних версий. В результате копипаст не разрастается, а ограничен "размером" обратной совместимости.
Подскажите пожалуйста какие могут быть подводные камни.