2017-03-22 51 views
0

我想了解如何使用MVVM模式進行CRUD操作。目前我在我的API控制器中有如下方法。我的問題是:使用MVVM模式,我還應該如何構建我的api(例如訪問數據庫)?還是應該改變?如果沒有任何變化,在這種情況下,我會實現ViewModels以及它們應該如何由API管理?我做了一些研究,但對我來說還不清楚。使用MVVM模式的Asp .NET Web API

public IHttpActionResult GetProduct(int id) 
{ 
    var product = _context.Products.SingleOrDefault(p => p.Id == id); 
    return Ok(product); 
} 

[HttpPost] 
public IHttpActionResult CreateProduct(Product product) 
{ 
    ... 
    _context.Products.Add(product); 
    _context.SaveChanges(); 

    return Created(new Uri(Request.RequestUri + "/" + product.Id), product); 
} 

回答

2

我認爲問題的一部分是,你不明白MVVM在Web應用程序中的作用。要理解,您必須將Web應用程序視爲由兩個獨立的應用程序組成 - 服務器端和客戶端。

服務器端,使用的模式是MVC(毫不奇怪,它被稱爲ASP.NET MVC的原因)。如果你試圖讓你對MVVM模式有所瞭解 - 不要。它不適用。服務器上的MVC模式很容易理解和實現;不要試圖撬動任何MVVM。只需使用服務器端模式設計您的服務器端代碼即可。

客戶端是另一回事。默認情況下,使用Razor頁面的ASP.NET MVC將在服務器上呈現您的HTML並將其傳遞給客戶端。而且,通常情況下,HTML旨在通過回發到服務器來響應用戶與頁面的交互。您的控制器方法解釋這些回發,執行所需的邏輯,並呈現正確的剃刀頁面作爲響應。但這不是編寫網站的唯一方法。

越來越多的人在設計單頁面應用程序。這些使用ajax回調將用戶操作的結果發送回服務器,然後處理響應。在服務器端,這些請求幾乎總是通過WebApi控制器方法處理,而不是ASP.NET MVC控制器方法。該請求以ajax的形式出現,並且結果通常以ajax的形式返回。沒有HTML被渲染。這就是MVVM發揮作用的地方。

客戶端方面,這些網頁通常使用JavaScript MVVM(ish)框架,如knockoutjsangular。響應json用於更新綁定到網頁中HTML元素的視圖模型。這些框架處理UI和這些視圖模型之間的同步更新和用戶操作,就像Bindings在UI和WPF中的視圖模型之間同步更新一樣。

簡而言之,MVC是它自己的事情,MVVM通常只存在於網站的客戶端,通常只有當網站廣泛使用ajax回調而不是回發。

而且,要回答您的直接問題,如果您在客戶端使用MVVM,使用ajax調用來執行您的CRUD操作,您應該設計WebApi控制器方法來發布/獲取/放入/刪除數據。

+0

謝謝。所以我認爲這只是對概念的誤解。在代碼方面,我認爲**一旦我有我的API發佈/獲取/放置/刪除,我的視圖正在向我的API請求ajax方法,我已經做了正確的想法。我一直在用web api構建我的服務器端,在我看來,我通常使用jQuery插件來請求ajax的API方法。我現在開始看Angular(嬰兒步驟),並且我遇到了MVVM概念,並且我感到困惑。感謝您的澄清(請根據需要對我剛纔所說的內容進行更正),歡呼聲。 – jtron

1

就個人而言,我總是使用Repository模式來處理與CRUD操作有關的任何事情,例如與數據庫中的實體進行交互。

我將創建一個名爲「ProductRepository」的單獨類,並將所有方法放在該類的Get,Create,Update和Delete Product中。這樣,只有您的Respository關心與數據庫交互的細節並對其執行CRUD操作。你的整個應用程序不應該關心如何完成,只需要你的Repository類。這就是所謂的單一責任原則。它是設計和架構的「固體」原則的一部分。

然後,在您的Controller或ViewModel中或您需要它發生的任何地方,您只需實例化ProductRepository並在整個應用程序中使用它的方法。

如果您爲服務層和數據訪問層使用單獨的Web API,那麼您並不需要MVC。您只需要一個前端框架來使用Web API URL,比如AngularJS或您選擇的任何其他JS框架。

如果你想使用MVC,那麼你並不需要Web API。您可以將您的服務層和數據訪問層構建到MVC應用程序中,或者將它們構建爲單獨的項目(類庫),並將它們包含在整個項目解決方案中。這一切都取決於你希望如何構建架構以及你想要如何複雜。

但無論哪種方式,都應該涉及「ProductRepository」 - 無論是在您的Web API中(如果您走這條路線),還是在您的MVC項目中(如果您走這條路線)。最終目標是分離關注點。您想要將業務邏輯層與數據訪問層分開。您不希望在整個應用程序中直接調用數據庫。這將導致代碼緊密耦合,很難隨時測試和維護。如果您將來更換數據庫,則只需更新代碼中的一個位置,而不是更新許多位置。

希望這可以幫助你一些!最好的問候和快樂的編碼!

+0

謝謝關於存儲庫的說明,Chase。很有用。 – jtron