1

假设我有一个 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; }
}

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

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

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

我已尽我所能避免这种情况。我删除了一些对复杂对象的依赖,但有些(如客户)非常重要,它们很难完全脱离 WCF 通信。我已经尝试阻止属性被序列化,但是 WCF 还是这样做了。

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

4

1 回答 1

2

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

分离层(并确保各层不会相互渗透)将允许您进行您所描述的更改,而不会影响其他层。

于 2013-09-23T19:33:41.043 回答