Модифицирует ли существующий тип 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>
Другие вопросы по тегам