Модифицирует ли существующий тип XSD, расширяя его от обратно того же типа, обратно совместимым?
Ранее я сделал XSD+WSDL для WS, который реализуется заказчиком. Мы реализуем клиента. У меня есть типа, как это в WS Create-операция:
<xs:complexType name="tWorkCreate">
<xs:sequence>
<xs:element ref="plan:workkey" />
<xs:element ref="plan:workdata" />
</xs:sequence>
</xs:complexType>
Теперь я хотел бы использовать тот же тип для новой операции обновления, но присвоение имен неверно. Поэтому я планирую сделать так:
<xs:complexType name="tWorkSet">
<xs:sequence>
<xs:element ref="plan:workkey" />
<xs:element ref="plan:workdata" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="tWorkCreate">
<xs:complexContent>
<xs:extension base="tWorkSet">
<xs:sequence>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
и использовать tWorkSet
непосредственно для Update
операция (tWorkCreate
операция будет такой же). Существующий клиент не нуждается (и не реализует) Update
, Причина не дублирования типа, например, в том, что мы могли бы обрабатывать оба Update
а также Create
аналогично в коде. Так что лучше просто дублировать тип или этот сценарий расширения имеет смысл?
2 ответа
Да, рефакторинг определений типов таким способом является хорошей идеей и обратно совместим 1. Все те же XML-документы, которые были действительны до рефакторинга типа, будут действительны и после рефакторинга. Фактически, это лучше, чем обратная совместимость, потому что точно такой же набор документов XML, который был действителен до изменения, будет действительным после изменения.
1 Предполагая, что клиенты не имеют прямых зависимостей от имен типов, таких как привязки JAXB или xsi:type
использовать в XML-документах. [Спасибо Petru Gardea. ]
Обратная совместимость очень сложна при применении к XSD. Схема может использоваться многими способами; без четкого понимания границ, это всего лишь предположение. Например, вообще неправильно утверждать, что изменение имени типа обратно совместимо; Что если кто-то использует xsi:type в своем действительном XML?
Создание иерархий типов также должно быть тщательно спланировано. Как и в большинстве современных языков OO, вы можете расширять только один тип.
В вашем случае вы, кажется, обеспокоены повторным использованием; тогда, возможно, самым безопасным может быть повторное использование путем создания группы, на которую затем ссылается ваш тип по мере необходимости. Конечно, "самый безопасный" зависит от границ, которые вы определяете. Для JAXB, .NET и т. Д. Группы поддерживаются, и по умолчанию они являются встроенными - то есть они не имеют никакого отпечатка с точки зрения XML и сгенерированного кода.
<xs:group name="tWorkSet">
<xs:sequence>
<xs:element ref="plan:workkey"/>
<xs:element ref="plan:workdata"/>
</xs:sequence>
</xs:group>
<xs:complexType name="tWorkCreate">
<xs:group ref="tWorkSet"/>
</xs:complexType>