2012-03-01 53 views
9

我知道,不是每個人都開發一個MVC應用程序時,使用了徹底的架構,但讓我們假設我有以下結構:瞭解新的Web API的方式

App.Core --> Class Library (POCO or Domain objects) 
App.Data --> Class Library (Repository and Entity Framework) 
App.Service --> Class Library (Service layer with all business logic) 
App.Web --> asp.net MVC 3.0 project 

App.Data --> Has a reference to App.Core 
App.Service --> Has a reference to App.Core and App.Data 
App.Web --> Has a reference to App.Core and App.Service 

我們的MVC裏面我們嘗試遵循這種方法:

  • 在我們的控制器(在一個方法中)內,我們實例化一個ViewModel。
  • 我們填補視圖模型調用從我們App.Service層
  • 一旦視圖模型填充方法,我們把它恢復到視圖(這樣的觀點 現在是強類型)。

這發生在99.9%的時間。它是乾淨的,我們喜歡它,它利用自己很好..等等!

現在我的問題是:

如果我們決定將我們的應用程序移到MVC 4.0,並開始使用新 網絡API的做法,我不知道我完全明白的地方(或它如何適合我們目前的架構?

請記住,我們願意改變這種情況!

我們是否應該在App.Service和App.Web之間創建一個新的App.WebAPI圖層? 這意味着在我們的控制器中,我們不再需要直接調用App.Service,而是使用新的App.WebAPI圖層?

或者,將Web API留在App.Web層,並讓控制器調用其他APIControllers,然後調用App.Service層?

不知道我在這裏有什麼意義...但請隨時提出建議,因爲我很好奇不同的投入。

感謝

回答

13

有一對夫婦的情況下考慮:

你想使這個網頁API作爲你的MVC應用服務層和數據訪問?如果是的話,那麼你應該從ASP.NET MVC項目中完全刪除App.Service的所有引用,並讓它查詢Web API來取出數據。在這種情況下,Web API位於ASP.NET MVC應用程序和數據訪問之間。 Web API與服務層交談並通過HTTP協議公開它。

或者您是否想爲您的網站提供可供其他客戶端(網頁瀏覽器除外)使用的附加API?在這種情況下,ASP.NET MVC應用程序和Web API位於同一圖層上。兩者都查詢您的服務層以填充視圖模型,只是在MVC應用程序的情況下,您將視圖模型傳遞給視圖,視圖又將視圖轉換爲HTML,而在Web API層中,您可能使用稍微不同的視圖模型,但是仍然從您的服務層填充並傳遞給使用相應序列化機制的客戶端(JSON,XML,...)

+2

我相信你的第二種方法是我們正在尋找的。考慮到我們可能有其他客戶(iPad,iPhone等)。所以得出的結論是MVC和Web API都位於同一層。使它們都與服務層(包含業務邏輯)進行交互,然後根據誰調用什麼來填充不同的ViewModel。那是對的嗎? – Vlince 2012-03-01 14:22:50

+0

@Vincen,正好。你有很好的總結。 – 2012-03-01 14:25:07

+0

謝謝你的幫助:-) – Vlince 2012-03-01 14:29:22

1

我知道這是遲到,但我實際上正在尋找相同的建議,我發現這個職位。

沒有「這兩個MVC和Web API坐在同一層」意味着更多的代碼維護工作,或可能重複的代碼?是不是被視爲瀏覽器客戶端的mvc網站? ..對我來說,將WebAPI作爲唯一的層給其他人是有意義的,並且它會調用你的服務層進行處理。

將Web API和MVC直接與服務層對話會有什麼好處? Web API不能成爲服務層的包裝?

+0

我認爲,在第二種選擇中,Web API只會用於將服務層的某些部分暴露給網絡,因此其操作將完全沒有邏輯(僅調用服務層)。它是一個非常瘦的代理,所以很容易維護,並且沒有重複代碼的機會。 – 2013-01-09 16:41:18

+0

概念性的例子:你有一個功能齊全的MCV網站,希望可以採用上面描述的體系結構或與之相近的東西。現在,你的經理說你需要移動應用程序。你需要另一層。假設您的網站有登錄信息。此登錄會使服務呼叫通過用戶名/密碼,並在成功返回完整網站上的配置文件或錯誤頁面。 API位於移動應用程序和服務層之間,與網站同層,但返回一些JSON,而不是返回{success:true,UID:some-number},允許手機以自己的渲染方法繪製配置文件頁面。 – 2014-01-16 21:24:06