IExtensibleDataObject достижения прямой и обратной совместимости - PullRequest
0 голосов
/ 27 декабря 2010
  1. Я не реализую этот интерфейс в DC на сервере.

  2. Хотя я получил эту реализацию, сгенерированную VS2008 на клиенте автоматически, это нормально.

  3. Теперь я иду и редактирую свой Reference.cs, чтобы включить новое поле (дифференцируя DC сервера (входной параметр) конкретного метода обслуживания)

  4. Скомпилируйте, запустите код, указывающий на старый сервис, он работает просто отлично, хотя я установил значение нового поля (например, логический тип в true), игнорируя мое значение.

  5. Тогда зачем внедрять на сервере для DC

  6. Я ожидаю прямой совместимости, и она просто отлично работает.

  7. Теперь я удаляю код, который только что добавил в # 3. Компиляция.

  8. Вместо этого добавлено то же поле в серверной компиляции DC.

  9. Теперь я запускаю код, отправляющий меньшие данные от клиента на серверный контроллер домена, имеет больше столбцов Это просто отлично работает. что означает, что обратная совместимость работает нормально?

  10. Надеюсь, кто-нибудь, где мое понимание неверно?

Моя среда .Net 3.5 Sp1

1 Ответ

1 голос
/ 27 декабря 2010

IExtensibleDataObject предназначен для другой цели. Предположим, что у вас есть такая операция:

[DataContract]
public class MyObject
{
  [DataMember]
  public string MyMember { get; set; }
}

[ServiceContract]
public class MyService
{
  [OperationContract]
  public MyObject Operation(MyObject object)
  {
    object.MyMember += " modified";
    return object;
  }
}

Ожидаемое поведение - операция возвращает измененный параметр.

Теперь предположим, что вы изменили контракт данных на клиенте:

[DataContract]
public class MyObject
{
  [DataMember]
  public string MyMember { get; set; }
  [DataMember]
  public string MyNewMember { get; set; }
}

Теперь давайте вызовем операцию:

var client = new MyServiceClient();
var myObject = new MyObject
  {
    MyMember = "Member",
    MyNewMember = "Some value"
  }; 

MyObject returnedObject = client.Operation(myObject);

Контракт данных службы не реализует IExtensibleDataObject и не знает о свойстве MyNewMember. Какое значение будет в returnObject.MyNewMember? Это будет ноль. Но если вы реализуете IExtensibleDataObject на стороне сервера, это будет «Некое значение», даже если сервер ничего не знает об этом свойстве.

...