Для веб-сервисов, если вы уверены, , что изменения произойдут, вы можете разработать «версионный» интерфейс, который принимает общие аргументы и номер версии. Я сделал это, используя строку XML, содержащую содержимое переданных параметров (строка XML, передаваемая веб-службе, закодирована в HTML, чтобы избежать нарушения SOAP-конверта).
В методах веб-службы выполняется проверка номера версии, после чего выполняется синтаксический анализ XML в ожидаемые типы для этого метода:
public void GenericWebServeceMethod(int version, string encodedXMLParameters)
{
string xmlParameters = HTMLDecode(encodedParameters);
switch(version)
{
case 1:
ParameterType1 p1 = DecodeVersion1XML(xmlParameters);
MethodVersion1(p1);
break;
case 2:
ParameterType2 p2 = DecodeVersion2XML(xmlParameters);
MethodVersion2(p2);
break;
}
}
Когда добавляются новые версии, вы расширяете оператор switch новыми версиями, которые по-прежнему позволяют клиентам, использующим более старые версии типов параметров, продолжать работать.
Для библиотеки DLL со ссылкой, используемой «внутри», вы можете сделать ссылку независимой от версии, добавив ссылку с помощью параметра «Обзор» в Visual Studio, а затем выбрав свойства ссылки и убедившись, что «Конкретная версия» свойство установлено на False
. Тогда вы все равно можете использовать систему, аналогичную описанной выше, чтобы изменить способ обработки параметров в кодировке XML на основе переданного номера версии. Добавление новых методов разрешено, но вызывающий клиент не увидит их, пока не будет перекомпилирован.