最近在做项目的时候,发现同一个数据契约再客户端隶属于两个不同的命名空间,为此如果两个服务进行交互的时候会涉及到类型 的问题,互操作性很差,要进行不必要的拆和装,在前面终于让我找到了答案,下面我来描述一下这个场景,大家请看下面。
[实体类] 大家请注意命名空间
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下一个版本可以改进这一点!!