Ответ 1
Версии - сложная тема, поэтому сначала вам нужно определить свои цели более наглядным образом. Было бы здорово сказать, что у вас есть интерфейс, гарантирующий, что вы никогда не нарушите совместимость, но в зависимости от того, что такое новая функциональность, это может быть даже невозможно. Таким образом, существуют разные ситуации и разные компромиссы.
Если вы намерены только предоставлять новые функции новым пользователям, а все ваши потребители являются прямыми потребителями (без посредников, фреймворков и т.д.), тогда выбор на основе дискретных конечных точек - лучший выбор. Каждый раз, когда вы добавляете функцию, которая рискует перерывом, создайте новую конечную точку, дайте ей новый номер версии, а затем пусть потребители узнают, чтобы проверить ее и переключить их конфигурации. Эта стратегия довольно испробована и верна, но у нее есть недостатки в том, чтобы возлагать нагрузку на потребителей на постоянную актуальность. Кроме того, если есть зависимости между службами, это может стать основной задачей для отслеживания. Воспроизведение вверх, если код нарушает его (напрямую) вашу ошибку.
Другой основной стратегией является расширяемый интерфейс. Здесь я знаю три разных сорта. Во-первых, это тип интерфейса, который так хорошо описывает домен службы, что каждая возможная функция, которую вы могли бы добавить, каким-то образом возможна с учетом существующего интерфейса. Если это звучит сложно, это так. Вы можете назвать это идеальным интерфейсом. Все полностью описано, но весь домен также полностью описан. "Совершенно" действительно только на бумаге.
Второй сорт - это тип, который выглядит как обычный интерфейс, но добавляет общие точки расширения. В WSDL это означает, что xs: любые, пары имя-значение или что-то подобное. Вы можете назвать это основным расширяемым интерфейсом. Это не слишком сложно сделать, но это не без осложнений. Точки расширения могут затруднить работу интерфейса в определенных инструментах (xs: any) или явно потерять часть вашей способности проверять входы и выходы (пары имя-значение). Также довольно легко злоупотреблять этими точками расширения таким образом, чтобы упростить использование версии 3 или 4.
Третий сорт - это тип, который преобразует ваш интерфейс в байтовый поток. Вы можете назвать эти интерфейсы богов. Они не лишены своих оправданий, но если вы используете их, вы можете спросить, почему вы используете веб-службы вообще. Возможно, вам стоит подумать о необработанном TCP/IP или базовом HTTP GET/POST. Но, может быть, вам надоела сложность WSDL и XSD, и вы просто хотите начать с нуля, но вы привязаны к веб-сервисам по какой-то причине инфраструктуры. Поймите, однако, что, как только вы начнете с этого пути, вам понадобится совершенно новый способ описать вашим потребителям, как/не использовать вашу службу, и если вы используете XSD для этого. Ну, вы в основном назад, где вы начали.
Лучше всего знать все эти варианты и подойти к дизайну сервиса, сначала попробовав "идеальный интерфейс", а затем откажитесь от добавления и добавьте общие точки расширяемости. Попытка разработать идеальный интерфейс заставит вас научиться вещам, которые улучшат вашу услугу, а не только ваш интерфейс, но для этого потребуется время, и если вы не ограничите это время, это будет навсегда.
Немного меньше интерфейса реального бога, есть интерфейс оболочки. Если у вас есть слои, вы хотите, чтобы ваш интерфейс тоже был в слоях. Когда вы меняете слой B, вы хотите только изменить слой B, а не все экземпляры в слое C.