2012-07-11 59 views
4

我負責ASP .NET MVC 3 Web應用程序的解決方案體系結構,並希望確保遵循最佳實踐。我曾經與MVC 3一起工作過,但使用別人放在一起的解決方案。從ASP .NET MVC3中調用WCF服務的最佳實踐是什麼?

我主要關心的是Web應用程序將使用WCF服務來檢索和更新數據。我不認爲直接從我的控制器方法調用WCF服務將是最佳實踐,但我不確定什麼是好的替代方案(可能是Repository模式,這與WCF結合使用會不常見嗎?)。我只想知道是否有我可以使用的標準模式/練習。

此外,WCF服務是許多其他Web服務的包裝,因此它有自己的業務對象類。我不確定是否應該在MVC應用程序中的WCF服務類和我的模型類之間創建另一個抽象層次。因此,例如WCF服務有一個Reservation類,我是否需要在Web應用程序的模型中創建相同的類?

任何援助將不勝感激。 謝謝!

回答

9

我的2美分

...我不認爲直接從我的控制器調用WCF服務 方法將是最好的做法,但我不知道一個好 替代方法是什麼(也許是一個知識庫模式[0121]

不,不要做另一個抽象。直接使用你的服務,在你的控制器中注入一個代理實例,直接從那裏調用WCF方法。如果你希望你可以創建一個包裝類來處理一些WCF錯誤或錯誤。

您的應用程序是否允許在不久的將來在WCF和數據庫(作爲數據源)之間輕鬆切換?如果不能遠離Repository模式 - 保持簡單,愚蠢!

此外,WCF服務是許多其他web服務 的包裝,所以它有它自己的類的業務對象。

不要編寫複製粘貼代碼,因爲它很難維護它。如果您需要在其中一項服務中更改某種類型,則必須在其他服務中進行相同的鏡像更改。

取而代之將所有常見業務對象分離爲單獨的項目(核心庫),並在其他任何解決方案中重新使用此庫。

+0

謝謝,我相信這回答我的問題:) – 2012-07-11 13:49:37

2

控制器負責獲取/轉換數據,因此它會通過代理與WCF服務交互。像這樣的東西(在VB.NET):

'TODO: You could extract the channel creation in a generic reusable method (Of T) 
Dim endpoint = New EndpointAddress() 'TODO: Initialize 
Dim binding = New BasicHttpBinding() 'TODO: Initialize 
Dim factory = New ChannelFactory(Of IYourContract)(binding, endpointAddr) 
Dim channel = factory.CreateChannel() 

Dim result = channel.YourOperation() 

WCF服務已經轉變「服務對象」變成「業務對象」,這樣你就可以在你的UI層對待相同的「業務對象」的「樣板」 。如果您的頁面特定或JSON序列化的實體較輕,則可以根據需要創建其他模型。

我通常會建議在WCF服務上使用'服務適配器',但在你的情況下,WCF服務似乎已經這樣做了。