2014-01-15 33 views
7

我想學習ASP.NET MVC 4,我很困惑,我應該把我的數據庫查詢。我有PHP的背景,特別是CodeIgniter,我習慣於將所有db查詢放入模型中。我有這個疑問:ASP.NET MVC - 在哪裏把數據庫查詢

db.Orders.Where(order => order.columnName == columnName).SingleOrDefault(); 

在此基礎上ASP.NET tutorial,我應該把它放在控制器。然而,我發現這個StackOverflow question,它說我應該把它放在模型中(類似於我以前用PHP做的)。對同一問題的另一個答案提到了創建包含所有查詢的存儲庫模式/類。

所以我的問題是,以下選項在代碼維護(可讀性,更改效果等)方面有哪些優缺點?

  1. 查詢在控制器
  2. 查詢在模型
  3. 查詢,從我的角度所謂模型MVC點一個單獨的類/層
+1

我們使用的設置是我們的數據是在模型中定義的,我們的查詢是在我們稱之爲服務的類中定義的,控制器處理所有事情。所以在控制器上創建一個新模型,然後調用服務來填充模型,然後將填充的模型傳遞給視圖 –

回答

4

最簡單的方法有一個倉庫模式來處理這個問題。這不是最好的辦法。但會給你一個想法,你可以如何處理與存儲庫模式。

創建一個存儲庫做你所有的數據庫事務

public interface IRepository 
{ 
    Order GetOrder(int orderId); 
} 
public class Repository : IRepository 
{ 
    YourDBContext db; 
    public Repository() 
    { 
     db = new YourDBContext(); 
    } 
    public User GetOrder(int orderId) 
    { 
     return db.Orders.FirstOrDefault(s=>s.OrderID==orderId); 
    } 
} 

您可以在同一個項目中創建這個(「數據訪問邏輯」下),或者爲此創建單獨的類庫(它指無論你在哪裏使用它)。

現在在你的控制器,輸入必要的命名空間後,只需創建你的版本庫的對象,並調用你有興趣

public OrderController :Controller 
{ 
    protected IRepository repo; 
    public OrderController() 
    { 
    repo=new Repository(); 
    } 
    public OrderController(IRepository repositary) 
    { 
    // This constructor is for your Unit test project, 
    // you can pass a mock repository here 
    // Read dependency injection 
    repo=repository; 
    } 
    public ActionResult details(int id) 
    { 
    var order=repo.GetOrder(id); 
    if(order!=null) 
    { 
     return View(order); 
    } 
    } 
} 

的方法,如果認爲您的觀點,您可以考慮使用一個視圖模型需要它。在這種情況下,您需要從您的域對象讀取屬性值並將其設置爲您的視圖模型的實例並將其返回到您的視圖。

隨着代碼/功能的增長,您可以將代碼移動到不同的類/圖層/項目。

0

不是數據庫的模型,但該類包含您需要創建視圖的所有信息。這意味着該類與數據庫完全斷開,並且具有不同信息的不同結構。

控制器必須驗證輸入條件(請求的參數)將其發送給檢索信息的類(如果您願意,可將其稱爲存儲庫),獲取數據並將其移入模型中。

當然,如果你想添加查詢到控制器,你可以,但會更難以測試控制器。使用其他方法可能會更容易(您可以模擬存儲庫的類/接口並且您已準備就緒)。

Byez .U