Не уверен, что решение должно быть таким сложным (если, конечно, я понимаю проблему ...):
- Убедитесь, что
TopLevelOperations
объявляет все методы, которые может использовать клиент.Делайте это независимым от протокола способом, например TopLevelOperations.doFoo()
, а не TopLevelOperations.doFooOverSOAP()
- Реализация
TopLevel
в качестве первой версии интерфейса с использованием SOAP / REST в зависимости от ситуации. - Убедитесь, что клиентытолько когда-либо ссылаются
TopLevelOperations
при объявлении ссылок - никогда не реализующий класс - Используйте какой-либо механизм, подходящий для вашего приложения, чтобы внедрить соответствующую реализацию в клиенты (Dependency Injection / Factory / ...).
Если / когда вы хотите повторно реализовать методы, используя другой транспорт / протокол, просто создайте другой класс (TopLevelNew
), который реализует TopLevelOperations
.Затем введите его клиентам вместо TopLevel
в шаге 4 выше.
Решение о том, какую реализацию использовать, является решением конфигурации уровня приложения, а не тем, о чем должны знать клиенты.
hth.
[Возможно, вы захотите /нужно использовать некоторые классы помощников для реализации, например, отделить контент от полезной нагрузки согласно ответу @ user384706.Но это дополняет вышеприведенное (то есть, как спроектировать реализацию и как поддерживать согласованность интерфейса для клиентов).]