2014-06-20 62 views
0

我的項目解決方案如下:哪些應該保留這個設計方法

  1. MVC項目(包含如下兩個項目的參考)
  2. WCF服務包含業務方法(方含下列項目的參考)
  3. 通用項目DTO或BusinessObject的

MVC中 - 調用WCF服務方法如下 - IList<Employee> RetriveData() 它從MVC - ServiceClient.RetrieveData()調用,現在問題是返回對象Employee指向ServiceHost.Employee對象而不是 - Common.DTO.Employee對象(庫項目)所以,它給出了類型轉換錯誤。

任何人都可以告訴我什麼是解決方案在這裏,或者我應該從MVC中刪除「Common.DTO」項目引用,並只使用Servicehost.Employee對象。

請指導我這個設計,應該用什麼。

注意:所有對象都是DATACONTRACT(可以serilizable)。 在MVC應用程序中,在檢索DTO對象後,我將它們轉換爲Viewmodel(它也在內部引用任何集合對象,如IList<ServiceHost.LookupItem>。是否可以直接使用所有生成的serilized對象,還是必須將每個返回對象轉換/ common.DTO.對象,然後轉換成視圖模型?

謝謝

回答

1

不要使用Visual Studio的添加服務引用。這樣做會導致多種類型的被定義在解決方案和客戶端代理隨着時間的推移將變爲不同步

定義您的整個解決方案使用的通用合同裝配要好得多。

請參閱WCF the Manual Way…the Right Way專頁3

你應該儘量遵循的模式,如規範的數據模型只要有可能。這意味着POCO ORM的類型相同; WCF;並作爲視圖模型中的聚合。數據轉換很昂貴;導致增加的維護和可能的保真度損失。 http://www.soapatterns.org/http://www.eaipatterns.com/

+0

我已經經歷了這種方法,並使用svcutil生成代理類,並將其添加到客戶端MVC應用程序(已刪除的服務參考)。現在,雖然返回對象是Common.DTO類型的類型,但沒有提及「Common.DTO」項目。還有一些問題-1。每次服務更新或者任何直接更新服務的方式時,我是否必須生成代理?2)我是否需要在客戶端項目中添加「Common.DTO」,或者是否需要從代理類參考中引用它3)有什麼區別將代理類「COMMON.DTO」和「ServiceHost.DTO」引用爲序列化對象。謝謝 – user3711357

+0

你甚至讀過那篇文章嗎? ** svcutil **與**添加服務參考**一樣糟糕。您的** Common.DTO **應該是您的合同庫,那麼爲什麼要刪除它? 1)是的,這是生成代理的問題。 2)你應該參考** Common.DTO ** 3)再次閱讀文章** – MickyD

0

這真的取決於你想要什麼樣的抽象級別。

如果ServiceHost.Employee是您的域模型和MVC是表示層,然後它將使意義在這裏使用DTO彌補差距。鑑於這是你看起來不錯的方法o想要使用那麼解決方案將有ServiceClient.RetrieveData返回IList<Common.DTO.Employee>而不是IList<ServiceHost.Employee>

+0

請查閱更新後的問答以獲取更多詳細信息。我想知道,使用ServiceHost.Employee是否可以,或者它是錯誤的。我必須在MVC中使用Common.DTO.Employee ...是否有任何影響或成本? – user3711357

+0

@ user3711357是的,有一個影響和成本。請參閱我的回答 – MickyD

+0

好的,但是,服務客戶端僅返回IList 。儘管WCF服務和MVC兩個應用程序都具有相同的項目引用,即「Common.DTO」。我應該如何將WCF服務的服務引用添加到MVC項目中,因此,我不需要將'ServiceHost.Employee'的轉換邏輯寫入'Common.DTO.Employee'並將direclty返回對象作爲IList '。謝謝 – user3711357

相關問題