Выберите «использование» пространства имен во время выполнения - PullRequest
0 голосов
/ 27 января 2009

У меня есть клиентское приложение веб-службы, которое подключается к стороннему веб-сервису. Сторонняя организация обновила свой веб-сервис, поэтому теперь мое клиентское приложение не работает с исключениями SOAP. К сожалению, я не могу просто обновить свое приложение для работы с новым веб-сервисом, так как некоторые из моих пользователей все еще будут использовать старый веб-сервис. Поэтому я бы хотел работать с любой версией веб-службы, используя одну версию моего клиентского приложения.

Поскольку Visual Studio генерирует кучу кода, который я компилирую при добавлении веб-ссылки, у меня теперь есть два файла: по одному для каждой версии веб-службы. Оба API на самом деле идентичны, просто изменились базовые SOAP-сообщения. Я поместил каждый из этих сгенерированных файлов в свое собственное пространство имен, чтобы избежать коллизий. Так что теперь я хотел бы иметь возможность выбирать, какое пространство имен использовать во время выполнения (на основе параметра конфигурации).

Например:

if (useOldVersion)
    using OldVersionNamespace;
else
    using NewVersionNamespace;

Очевидно, что это никогда не сработает, поскольку не будет никакого способа скомпилировать код, который ссылается на элементы в этом пространстве имен. Есть ли простой способ решить эту проблему? Может быть, я мог бы использовать отражение, чтобы делать то, что мне нужно во время выполнения?

Единственное, о чем я могу подумать, это буквально скопировать / вставить мой текущий код в два разных файла, с той лишь разницей, какое пространство имен используется вверху. Это кажется очень плохой идеей.

Ответы [ 2 ]

4 голосов
/ 27 января 2009

Заставьте оба набора сгенерированных классов реализовать общий интерфейс. Это довольно легко с частичными типами - вам вообще не нужно изменять сгенерированный класс, просто создайте соответствующий интерфейс, а затем файл с теми же типами, что и сгенерированные, говоря, что они реализуют интерфейс.

Затем вы кодируете интерфейс и выбираете, какую реализацию выбрать в одном месте на основе файла конфигурации.

Дополнительным преимуществом этого является то, что вы можете писать модульные тесты для своего кода, высмеивая веб-сервис.

0 голосов
/ 28 января 2009

не могли бы вы использовать время компиляции, если?

#If (BuildType)
using X;
#else
using Y;
#endif

http://msdn.microsoft.com/en-us/library/4y6tbswk.aspx[link текст] [1]

это быстро и грязно. надеюсь, что это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...