2011-07-05 66 views
2

我有一個WPF應用程序,它使用WCF服務對使用EF4的實體執行操作。 我的項目結構如下:多個SVC引用每個公開相同的實體

項目:EntityObjects

  • 這哪裏是EDMX文件住

項目:WCFService

  • 參考EntityObjects
  • 有數據合同對實體執行操作
  • 有三種不同的SVC文件,稱爲Partner.svc,Section.svc,Scheme.svc

項目:數據層

  • 有Partner.svc,section.svc,scheme.svc服務引用

問題是DataLayer項目對對象有不明確的引用,因爲每個svc文件都會返回自己對實體對象的引用。

我該如何解決這個問題?

+0

所以你有多個服務共有的實體對象? – BonyT

+0

是的,有一個edmx被所有三個服務使用 – Madeleine

+0

我認爲我不應該有三個不同的服務,而是一個。我只是試圖修復一個設計糟糕的項目並儘可能地保留。 – Madeleine

回答

3

它不會以這種方式工作。如果要在所有三個服務引用中使用相同的數據合同類型,則必須使用data contract sharing。這意味着在添加服務引用之前,您的數據合約必須在單獨的程序集中提供給客戶端項目。這通常意味着您將在服務器和客戶端之間共享數據合約彙編。在你的情況下,這意味着與整個EF的東西共享EntityObjects - 這是不好的。

有多種解決方案:

  • 配售實體和EDMX東西到單獨的項目,只共享與實體
  • 使用自定義數據傳輸對象,而不是實體數據的合同項目,並與這些DTO
  • 共享組件
  • 不要共享程序集,而是要爲客戶端手動創建數據合同的「複製」
  • 不要通過不同的服務暴露相同的實體
  • 如果在您的架構中有意義,則只使用單一服務

最後兩種選擇更多地是關於您的應用程序的體系結構。

+0

這絕對是一個現實世界的問題,並感謝列出可能的解決方法。然而,我認爲應該有更好的解決方案,而不是解決方法。 MS可以構建VS工具(如果不是WCF本身) –

0

您可以:

構建一個封裝類,它封裝了對所有3個服務的訪問。然後直接引用DataLayer項目中的相關對象,而不是通過服務並根據需要在包裝類中進行轉換。

相關問題