WCF DTO版本

时间:2010-05-24 12:03:20

标签: web-services wcf

我现在有一些服务返回带有以下字段的dto:

[DataMember]
public int Id { get; set; }
[DataMember]
public string Name { get; set; }

我希望通过添加以下属性为此服务添加更多内容:

[DataMember]
public virtual DateTime StartDate { get; set; }

我不能让我可以更新这些服务的消费者 - 客户自己这样做。

我的问题是 - 旧客户能否跳过这些新属性?新的利用它们还是序列化会成为新属性的问题?

瓦特://

3 个答案:

答案 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,你应该没事。