使WCF解串器具有容忍变化的能力

时间:2013-09-23 19:24:13

标签: c# .net wcf web-services datacontract

假设我有一个C#Web应用程序和一个C#WCF服务浮动到那里。他们按照这样的合同运作:

[ServiceContract]
public interface IRemoteDeliveryService
{
    [OperationContract]
    Customer GetCustomer();
}

......与顾客在一起:

[Serializable]
public class Customer
{
    public string Name { get; set; }
    public int Age { get; set; }
}

现在假设Web应用程序使用与WCF服务无关的功能进行更新,但会导致客户扩展。

[Serializable]
public class Customer
{
    public string Name { get; set; }
    public int Age { get; set; }
    public int Income { get; set; } // new!
}

根据经验,如果服务引用和服务没有立即更新,用户将开始收到此错误,直到推送WCF服务以反映新对象:第1行位置错误21175.'EndElement''(无论如何) 'from namespace'http://schemas.datacontract.org/2004/07/(whatever 2)'不是预期的。期待元素'_whatever3'。'

我已经做了所有我能想到的事情以避免这种情况。我删除了许多对复杂对象的依赖,但有些(如Cu​​stomer)非常重要,因此很难完全取消WCF通信。我已经尝试阻止属性被序列化,但无论如何WCF都会这样做。

如何使WCF服务更能容忍Web应用程序引入的预期额外属性?我可以修改服务和Web应用程序,只要修改服务可以最大限度地减少未来的多余重新部署。

1 个答案:

答案 0 :(得分:2)

使用数据传输对象(DTO)。这些类应属于该服务,并且只应在服务更新时更改。使用类似AutoMapper的东西将业务对象,实体,模型等映射到您的DTO中。

分离层(并确保各层不会相互渗透),这样您就可以在不影响其他层的情况下进行更改,而不会影响其他层。