2010-02-24 61 views
19

我構建了一組共享公用數據協定(或實體,如果您願意的話)的WCF服務。這些是使用DataContract和DataMember屬性修飾的簡單數據傳輸對象。我明確地指定了名稱和名稱空間。在試圖遵循IDesign的平均每個服務合同12個成員的建議原則時,我將我的服務項目分成多個服務。引用相同數據協定的多個WCF服務

我的數據合同是在一個獨立的程序集中,如果他們使用.Net,我可以提供給我們的客戶。他們可以告訴他們的服務引用重用引用程序集中的類型。但是,如果他們沒有使用.net,並且他們使用兩個服務都使用同一個實體,那麼他們會假設我們會得到一個模糊的參考消息。如果我不參考數據合同DLL,我可以在Visual Studio中看到這一點。

我的問題是,我可以在我的服務中做什麼,或者他們可以在客戶端應用程序中執行以避免必須限定數據合同來自哪個代理?

+0

我遇到同樣的問題。我試圖使用下面的文章中的建議,但沒有喜悅。但是,我使用的是WCF RESTful服務(這可能與下面的方法不起作用有關),所以我最終引用了一個包含我的數據合同的常見DLL,並且將所有服務引用都放在一起。由於我使用簡單的HTTP Web請求調用我的服務,因此實際上並不需要項目中的服務引用。 – Nick 2012-02-27 23:08:00

回答

2

我還傾向於將所有數據契約保留在一個由多個服務和衆多客戶端應用程序引用的程序集中,這很好用,但我從未嘗試過使用.NET以外的服務。

知道他們使用什麼技術來使用.NET以外的服務可能會有幫助嗎?什麼是拋出這個含糊不清的參考信息?

+0

你可以在.net中做,只是不參考你的數據合同DLL,看看會發生什麼。創建一個測試項目,添加兩個使用通用數據協定作爲參考的服務,您將得到模糊的消息。 – 2010-02-24 16:14:45

0

我碰巧有多個服務在我的一端共享對象。我不確定你爲什麼遇到這個問題。就我而言,我能夠以這種方式訪問​​對象。 。 。 。

服務1客戶=新服務1()

client.CommonLibrary.Address。 。 。

服務2客戶端2 =新服務2()

client2.CommonLibrary.Address。 。 。 。

+0

這也適用於我。重點是他們是2個不同的對象。消費應用程序不能只說CommonLibrary.Address,它必須使用服務名稱進行限定。這不是一個真正的問題,我只是想知道服務引用是否會爲通用數據合同檢測相同的名稱空間並共享它。 – 2010-02-24 19:52:21

0

從我的理解,並與WCF的工作,無論是通過客戶端應用程序使用的數據合同的一方不會,只要事情是完全合格的名稱是相同的,並且具有相同的數據成員。在內部它只是動態地創建對象,並使用公共setter重新分配這些數據成員屬性。

一個更好的辦法,我認爲是重構你的數據的合同,這樣你就會把所有的通用跨多個服務爲一體的組裝和引用它們,因此你不會有這樣的ambiguious或衝突的問題,無論許多服務是如何的由客戶端應用程序使用。

+0

Fadrian,我的所有數據合同都在一個程序集中。問題是,如果2個服務引用相同的數據協定,則每個服務都有自己的名稱空間版本。 – 2010-02-26 16:32:54

+0

Paul,您是否嘗試在DataContract屬性中明確指定名稱空間?以及您是如何創建數據合約程序集的?您是否嘗試使用svcutil工具並使用/ namespace:parameter來手動生成數據控件?我個人還沒有這個問題,所以我可能不會按右鍵,只是在這裏分享一些想法。 – 2010-02-27 01:49:01

0

我們不是通過Visual Studio助手生成我們的服務代理,而是通過自定義批處理文件調用slsvcutil.exe(因爲我們使用Silverlight)。在那裏,你可以使用/ N參數像這樣指定一個命名空間映射:

"C:\Program Files (x86)\Microsoft SDKs\Silverlight\v5.0\tools\slsvcutil.exe "^ 
http://ServiceUrl/MyService.svc^ 
**/n:http://youruri.org/CustomerService/DataContracts,CLR.Namespace.CustomerService^** 
/n:*,CLR.Namepsace.MyService^ 
/r:"%ProgramFilesFolder%\Reference Assemblies\Microsoft\Framework\Silverlight\v5.0\System.Windows.dll"^ 
/ct:System.Collections.ObjectModel.ObservableCollection`1^ 
/edb^ 

所以具有命名空間http://youruri.org/CustomerService/DataContracts所有數據合同產生的代理文件等的CLR命名空間CLR.Namespace.CustomerService。假設你已經在相同的代理程序集中預先生成了這個代理,你可以將這個整個命名空間從你的第二個文件中刪除,並且一切正常 - 我們爲最後一步寫了一個小工具。所有其他契約名稱空間將生成到CLR.Namepsace.MyService namspace(請參閱星號意思是全部)

該過程是一些需要設置的hazzle,因爲您必須手工製作批處理文件,但一旦完成它運作良好。