【发布时间】:2015-10-28 19:41:07
【问题描述】:
假设我们有一个简单的 DTO,我们想将其用作 CustomerUpdate 方法的输入参数:
[DataContract]
public class CustomerUpdateDTO
{
[DataMember(IsRequired = true, Order = 0)]
public int CustomerId { get; set; }
[DataMember(Order = 1)]
public string FirstName { get; set; }
[DataMember(Order = 2)]
public string LastName { get; set; }
[DataMember(Order = 3)]
public string Address { get; set; }
}
只需要一个文件 - CustomerId - 这很明显,因为我们必须知道要更新哪个客户。我想实现以下目标:
如果传入的 SOAP 消息包含给定值(例如:Joe),则表示客户端想要更新此属性。如果 SOAP 消息不包含值,则不应更新该值。如果属性的值应该被删除(为空),客户端应该使用 nil="true" 属性显式声明它(因此显式传递一个空值)。
例子:
<CustomerUpdateDTO>
<CustomerId>1</CustomerId>
<FirstName>Joe</FirstName>
<Address xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
</CustomerUpdateDTO>
这样格式的消息意味着,客户端只想更新 FirstName,保持 LastName 不变,并将地址设置为 null。
问题是,在默认配置下,这样的消息被反序列化为:
CustomerId = 1
FirstName = "Joe"
LastName = null
Address = null
所以 LastName 和 Address 都以 null 结尾。
有没有办法判断哪个“null”是由省略 SOAP 消息中的值引起的,以及哪个“null”是显式设置的?
如果不是,对于这种情况,什么是“最佳实践”?
【问题讨论】: