Управление обратной совместимостью словаря DataMember в WCF - PullRequest
0 голосов
/ 11 ноября 2010

В версии 1 моего продукта у меня есть DataMember, который выглядит следующим образом:

[DataMember]
private Dictionary< EnumType1, Class1>  Class1Dictionary;

Где EnumType1 определяется как:

[Flags]
public enum EnumType1
{
    EnumMember1 = 1;
    EnumMember2 = 2;
    EnumMember3 = 4;
}

Сообщение SOAP выглядит так (перефразирую):

<Class1Dictionary>
    <KeyValueOfEnumType1Class1UTLV0zE5>
        <Key>EnumMember1 </Key>
        <Value> ... </Value>
    </KeyValueOfEnumType1Class1UTLV0zE5>
</Class1Dictionary>

В версии 2 я хочу изменить Class1Dictionary на Dictionary<string, Class1>, а не Dictionary<EnumType1, Class1>, но я хочу сохранить совместимость уровня обслуживания с предыдущей версией. Конечно, сервер / клиент версии v2 будет знать, как обращаться с конкретными значениями для Key, которые соответствуют значениям перечисления, о которых он знает. Для всех остальных исключений - ожидаемое поведение.

Моей первой идеей было просто изменить Class1Dictionary:

[DataMember]
private Dictionary< string, Class1>  Class1Dictionary;

но это приведет к искажению сообщения SOAP, например, при изменении KeyValueOfEnumType1Class1UTLV0zE5 на другое значение. Итак, вопрос в том, как я могу аннотировать этот DataMember или использовать любую другую функцию WCF, чтобы сохранить мой словарь в коде v2, но использовать DataContract, совместимый с DataContract версии 1?

Ответы [ 3 ]

1 голос
/ 11 ноября 2010

См. http://msdn.microsoft.com/en-us/library/aa347850.aspx

[CollectionDataContract
    (Name = "Class1Dictionary", 
    ItemName = "KeyValueOfEnumType1Class1UTLV0zE5", 
    KeyName = "Key", 
    ValueName = "Value")] public class MyDictionary : Dictionary<string, Class1> { }
1 голос
/ 11 ноября 2010

На основании информации, предоставленной вами в вопросе, я не уверен, что вы можете делать то, что хотите: обычно для любой обратной совместимости вы добавляете новые элементы данных, вы не меняете тип существующих элементов данных. Поэтому вам может потребоваться создать еще один контракт на обслуживание с соответствующими изменениями в контракте на данные. Было бы лучше, если бы вы прочитали информацию по этой ссылке: Best Practices: Управление версиями контракта данных и применили эту информацию к вашим обстоятельствам.

Вы также можете прочитать информацию по следующим ссылкам: 1. Управление версиями контракта данных 2. Предварительно совместимые контракты данных

0 голосов
/ 10 декабря 2010

В итоге я понял правильный ответ.Пока DataContracts совместимы, он будет работать.И эти фанки сгенерированные имена игнорируются в этом отношении.Это означает, что

List<KeyValuePair<string,Class1>>

совместимо с:

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