我现在有一些服务返回带有以下字段的dto:
[DataMember]
public int Id { get; set; }
[DataMember]
public string Name { get; set; }
我希望通过添加以下属性为此服务添加更多内容:
[DataMember]
public virtual DateTime StartDate { get; set; }
我不能让我可以更新这些服务的消费者 - 客户自己这样做。
我的问题是 - 旧客户能否跳过这些新属性?新的利用它们还是序列化会成为新属性的问题?
瓦特://
答案 0 :(得分:0)
只要旧属性没有改变(并且新属性被标记为可选),你应该没问题。
这样说,您应该发布新合同并让客户端重新生成服务引用 - 或者将新版本部署到不同的端点,这样当它们准备好切换时,它们将被迫指向新的端点。
答案 1 :(得分:0)
从我所看到的,DataContractSerializer只是为反序列化时找不到的属性添加null。跟踪一些错误相当棘手 - 有时候我会更喜欢它更严格并给出例外。
另一个需要考虑的选择是将原始DTO子类化以创建新的派生类。
为了使序列化正常工作,您需要为具有属性的超类型指定可用的派生类:
[DataContract]
[KnownType(typeof(DerivedDTO))]
public class OriginalDTO
在使用附加属性的代码中,您需要将对象强制转换为DerivedDTO才能访问该属性(我使用as关键字并在使用之前检查结果引用是否为null)
答案 2 :(得分:0)
只要新成员StartDate
未被声明为必填字段 - 因此不工作:
[DataMember(IsRequired="True")]
public virtual DateTime StartDate { get; set; }
但只要你遗漏IsRequired=True
,你应该没事。