IExtensibleDataObject достижения прямой и обратной совместимости
Я не реализую этот интерфейс в DC на сервере.
Хотя я получил эту реализацию, сгенерированную VS2008 на клиенте автоматически, и это нормально.
Теперь я иду и редактирую свой Reference.cs, чтобы включить новое поле (дифференцируя DC сервера (входной параметр) конкретного метода службы)
Скомпилируйте, запустите код, указывающий на старый сервис, он работает просто отлично, хотя я установил значение нового поля (например, логический тип в true), игнорируя мое значение.
Тогда зачем внедрять на сервере для DC
Я ожидаю прямой совместимости, и она просто работает нормально.
Теперь я удаляю код только что добавленный в #3. Компиляция.
Вместо этого добавлено то же поле в серверной DC-компиляции.
Теперь я запускаю код, отправляющий меньшие данные с клиента на серверный контроллер домена, имеющий больше столбцов. Это просто отлично работает. что означает, что обратная совместимость работает нормально?
Надеюсь, что некоторые, где мое понимание не правильно?
Моя среда.Net 3.5 Sp1
1 ответ
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 на стороне сервера, это будет "Некое значение", даже если сервер ничего не знает об этом свойстве.