2012-05-13 38 views
4

我想將WCF合同接口移至第三個DLL,並在手動生成代理時從客戶端開始使用它們。將WCF合同移至單獨的DLL

當我從客戶端使用它們來生成代理時,DLL中的那些接口是否必須具有[ServiceContract]屬性?

任何想法什麼是最好的命名爲Dll將只有合同和DTOs在客戶端和服務器之間共享。

+0

你是什麼意思的「手動生成代理」?據我瞭解,你想通過重用現有程序集中的類來生成代理。是這樣嗎? –

+0

@Andriy Buday是 –

回答

5

將WCF數據和服務契約分開組裝是非常普遍的做法。在我之前的項目中,我們使用的名字如Company.OurProject.Contracts.dll。 我認爲要重新使用現有類來生成代理,您應該將用於服務合同(標記爲[ServiceContractAttribute])的接口和相應的數據合同放到該程序集中。我會避免把服務的實際實施。

這裏是SO與更深入地瞭解當選擇「中引用組件重用類型」什麼都可以重複使用另一個偉大的答案:WCF Service Reference generates its own contract interface, won't reuse mine

1

這是常見的,也許是推薦的方法。

是的,你應該把服務合約放在合同dll中的服務接口上。

請記住,名稱空間不必與dll的名稱相匹配。假設您的當前程序集類似CompanyName.Technology.Service.dll,其命名空間類似於CompanyName.Technology.Service,您應該將合同解壓縮到另一個程序集,但保持命名空間相同(假設它仍然有意義)並且程序集名稱爲CompanyName.Technology.Service.Contracts。你不想擁有的是名稱爲「合約」的命名空間。

+0

爲什麼保持名稱空間並且沒有名稱「合同」在其中很重要?爲了向後兼容? – xr280xr

+1

@ xr280xr - 我所做的是將它移動到另一個不想更改名稱空間的程序集,如果您沒有在ServiceContract屬性中設置自定義名稱空間。這會導致任何現有客戶之間的合同不匹配。 – Bronumski

0

我使用* .ServiceContracts.dll,因爲我最終在我的系統中有多個合約程序集。例如DataContracts.dll用於訪問數據存儲。

+0

另外,如果您共享您的二進制文件,我會避免生成的代理。我發現它是一個更清潔的WCF工作方式。您可以直接使用代理,而不是生成包裝代理的代碼。 –