最近在做項目的時候,發現同一個數據契約再客戶端隸屬於兩個不同的命名空 間,為此如果兩個服務進行交互的時候會涉及到類型 的問題,互操作性很差,要進 行不必要的拆和裝,在前面終於讓我找到了答案,下面我來描述一下這個場景,大家 請看下面。
[實體類] 大家請注意命名空間
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號服務去進行處理,
這就出現了同一個數據契約兩個不同的命名空間問題,大家看一下對象浏覽器 兩個代理所生成的東西,
這樣一來我們如果要放進2號服務去操作的話必須顯示聲明 TwoCustomerService_Proxy.Customer進行轉換,這樣的場景或許大家都經常碰到, 下面我說一下解決辦法,
按照WCF編程第二版中的說法,我把原話給大家發一下
在Visual Studio 2008添加一個服務引用時,你必須為每個服務引用提供唯一 的新命名空間。導入的類型會定義在這個新的命名空間中。如果為共享了相同數 據契約的兩個不同服務添加引用,就會出現問題,因為你得到了兩個不同的類型 ,在兩個不同的命名空間,表示的卻是相同的數據契約。然而,默認情況下,如 果被客戶端引用的任意一個程序集包含的數據契約,與已經暴露在引用服務元數 據的數據契約類型匹配,Visual Studio 2008就不會再次導入。需要再次強調的 是,已有的數據契約引用必須是在另一個引用程序集中,而不是在客戶端項目自 身。這一限制會在未來的Visual Studio版本中提供,而目前最方便的彌補措施與 最佳實踐則為:將所有共享的數據契約分解到指定的類庫中,並讓所有的客戶端 引用該程序集。然後,通過服務引用的高級設置對話框(參見圖1-10),可以控 制和配置引用程序集(如果存在)與有關的共享數據契約進行協調。“Reuse types in referenced assemblies”檢查框默認是被選中的,但如果你需要也可 以關閉這一功能。顧名思義,你只能共享數據契約,卻不能共享服務契約。使用 裡面的單選按鈕,可以讓Visual Studio 2008跨所有的引用程序集重用數據契約 ,或者通過選擇列表項限制對特定程序集的共享。
s這段話的意思就是讓你把我服務端的DLL引用到客戶端來,在服務配置中來共 享同一個數據契約,見下圖
大家看見沒有,需要指定服務引用的程序集,這樣才不會存在命名空間類型的問 題,這樣做我知道非常不合理,但是如果客戶端自己開發的話而不是其他平台調用 的話這樣也是沒有辦法中的辦法,期待WCF下一個版本可以改進這一點!!