位置:海鸟网 > IT > ASP.NET >

谈WCF数据契约疑问之共享数据契约

  最近在做项目的时候,发现同一个数据契约再客户端隶属于两个不同的命名空间,为此如果两个服务进行交互的时候会涉及到类型 的问题,互操作性很差,要进行不必要的拆和装,在前面终于让我找到了答案,下面我来描述一下这个场景,大家请看下面。

  [实体类]  大家请注意命名空间

  using System;

  using System.Collections.Generic;

  using System.Linq;

  using System.Text;

  namespace GaryChenWCFService

  {

  /// <summary>

  /// 测试实体类

  /// </summary>

  public class Customer

  {

  public string Name

  {

  get;

  set;

  }

  public string Sex

  {

  get;

  set;

  }

  }

  }

  下面是1号服务  注意:返回的是GaryChenWCFService.Customer类型的对象

  using System;

  using System.Collections.Generic;

  using System.Linq;

  using System.Text;

  namespace GaryChenWCFService.ServiceClasses

  {

  public class OneCustomerService :ServiceContracts.IOneCustomer

  {

  #region IOneCustomer 成员

  public GaryChenWCFService.Customer GetCustomer()

  {

  //省略

  }

  #endregion

  下面是2号服务  注意:添加的是GaryChenWCFService.Customer类型的对象

  using System;

  using System.Collections.Generic;

  using System.Linq;

  using System.Text;

  namespace GaryChenWCFService.ServiceClasses

  {

  public class TwoCustomerService : ServiceContracts.ITwoCustomer

  {

  #region ITwoCustomer 成员

  public void AddCustomer( GaryChenWCFService.Customer cs )

  {

  //省略

  }

  #endregion

  }

  }

  宿主部分我们省略...我们来看客户端,问题来了

  using System;

  using System.Collections.Generic;

  using System.Linq;

  using System.Text;

  namespace GaryChenClient

  {

  class Program

  {

  static void Main( string[] args )

  {

  OneCustomerService_Proxy.OneCustomerClient OneService_Proxy = new GaryChenClient.OneCustomerService_Proxy.OneCustomerClient();

  TwoCustomerService_Proxy.TwoCustomerClient TwoService_Proxy = new GaryChenClient.TwoCustomerService_Proxy.TwoCustomerClient();

  OneCustomerService_Proxy.Customer cu = OneService_Proxy.GetCustomer();

  TwoService_Proxy.AddCustomer(cu);

  }

  }

  }

  1号服务取得的Customer属于OneCustomerService命名空间,现在我要把这个取得出来的对象放入2号服务去进行处理,

  这就出现了同一个数据契约两个不同的命名空间问题,大家看一下对象浏览器两个代理所生成的东西,

  

  大家看见没有,需要指定服务引用的程序集,这样才不会存在命名空间类型的问题,这样做我知道非常不合理,但是如果客户端自

  己开发的话而不是其他平台调用的话这样也是没有办法中的办法,期待WCF下一个版本可以改进这一点!!