gpt4 book ai didi

c# - IExtensibleDataObject 在客户端中的使用

转载 作者:太空狗 更新时间:2023-10-29 18:04:55 24 4
gpt4 key购买 nike

我已将我的 Web 服务转换为具有一些数据契约(Contract)的 wcf 服务。作为最佳实践,建议 DataContracts 应继承自 IExtensibleDataObject。我明白了,在添加或删除数据成员的情况下,IExtensibleDataObject 很有用。但我无法了解客户将如何访问已删除的数据成员。这是我的代码:

[ServiceContract(Namespace = "http://mycompany.com/2010/08/")]
public class MyWebService {
[OperationContract]
public Employee Add(Employee emp)
{
// Some Processing
}
}

[DataContract(Name = "Employee", Namespace = "http://mycompany.com/2010/08/")]
public class Employee : IExtensibleDataObject {
[DataMember] public string FirstName;
[DataMember] public string LastName;

public ExtensionDataObject ExtensionData { get; set; }
}

现在在我的下一个 Web 服务版本中,我对 DataContract 做了一些更改

[DataContract(Name = "Employee", Namespace = "http://mycompany.com/2010/09/")]
public class Employee : IExtensibleDataObject {
[DataMember] public string FirstName;
[DataMember] public string LastName;
[DataMember(IsRequired = true)] public string MiddleName;

public ExtensionDataObject ExtensionData { get; set; }
}

但是,我的客户端正在访问我的旧版本 Web 服务,但由于未提供 MiddleName 字段而出现错误。我仍然对 IExtensionDataObject 的用法感到困惑。

最佳答案

这是 IExtensibleDataObject 的不正确用法。您已经在服务器端修改了数据契约(Contract),并且根据需要标记了新字段,这意味着您破坏了版本控制并且没有任何帮助。

IExtensibleDataObject 用于其他目的。假设您已经修改了客户端,以便客户端上的数据协定包含 MiddleName。现在您设置 MiddleName 并使用添加服务操作。返回的 Employee 对象中的 MiddleName 值是多少?如果您不使用 IExtensibleDataObject,该值将为 null,如果您使用 IExtensibleDataObject,该值将与您为输入参数设置的值相同。

当使用 DataContractSerializer 时,WCF 会丢弃所有无法理解的参数。 IExtensibleDataObject 通过将所有这些参数存储在特殊集合中并将它们发送回客户端来避免这种情况。

如果您想使用契约(Contract)版本控制,请忘记必填字段。这是打破它的第一件事。

关于c# - IExtensibleDataObject 在客户端中的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3434045/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com