2011-07-13 96 views
3

我知道,當你創建你可以創建一個通用的DataContract服務:是否可以從客戶端使用通用DataContract?

[DataContract(Name = "Get{0}Request") 
public sealed class GetItemRequest<T> 
    where T : class, new() { ... } 

[DataContract(Name = "Get{0}Response") 
public sealed class GetItemResponse<T> 
    where T : class, new() { ... } 

[ServiceContract] 
public void MyService : IMyService 
{ 
    [OperationContract] 
    GetItemResponse<Foo> GetItem(GetItemRequest<Foo> request); 
} 

這生成WSDL我一個GetFooRequestGetFooResponse定義。現在,我很好奇的是,如果有可能走向另一個方向?

是否有可能創建一個使用通用DataContracts並通過這些服務器作爲一個具體的對象的客戶?我在添加Service Reference之後嘗試了這一點,但實際上效果並不好。所以這更多的是我想知道是否有任何方式(即使它不需要添加服務引用)來執行此操作?

+0

我承認,這個功能(如描述在這裏MSDN(http://msdn.microsoft.com/en-us/library/ms731045.aspx))是*不*一個我以前見過。有趣。 –

+0

@Marc:是的,但它只是一半有用。負責「ServiceContract」和「OperationContract」類的另一個團隊在生成Name值時鬆開關閉,並且不對DataContract執行的泛型進行很好的檢查,因此爲什麼不能創建具體定義的泛型操作/服務合同!也許C#5? :) –

回答

3

最終,WCF將查看合同類。如果這是從WSDL/MEX生成的,它不會有這個(因爲這不是它在元數據中的表達方式) - 但是如果你的客戶端具有上面的代碼,那麼確定它應該可以正常工作。

如果添加參考(即一個DLL /項目引用)從客戶端的DTO的DLL,並確保WCF,使共享組件,它應該工作。如果它仍然阻止,那麼作弊:使用服務參考只是爲了獲取配置數據。然後刪除服務引用,但保留配置(否則這些配置文件是一種痛苦)。然後它應該找到庫中的類型。

+0

我想我找出了我的問題。泛型類位於自己的名稱空間MyNamespace.Common中,具體定義在不同的名稱空間MyNamespace.Services.XService中生成。因此,在客戶端,我仍然將泛型類放在一個'MyNamespace.Common'定義中,因此我沒有使用正確名稱空間中的具體定義。基本上,它沒有我想象的那麼有用,因爲我仍然需要創建一個具體類型'GetFooRequest:GetItemRequest ',爲它添加一個DataContract屬性(所以我也可以添加Name/Namespace)。 –

+0

看起來,即使可能,從客戶端到服務器看起來並不像從服務器到客戶端那樣有用。我將不得不多玩這個。 –

相關問題