2013-10-01 47 views
1

聲明實體框架命令或數據集(ado.net)用於訪問或操縱mvc模式中的數據應該在模型中,因爲我知道,當我想要獲取數據庫中的對象列表方法應該是在模型和返回列表,控制器只應該拿到,並通過它來查看,mvc模式中模型和控制器的分離

但正如我在許多代碼decalaring在控制器方法看時,像^

//I get logged in user properties 
     var user = db.UserProperties.SingleOrDefault(x => x.UserName == User.Identity.Name);    
     Buddyship allBudees = db1.Buddyships.SingleOrDefault(u =>u.BuddiedByUserId == user.UserId); 
     var buds = from u in db.UserProperties 
        join m in db1.Buddyships on u.UserId equals m.BuddiedByUserId 
        where m.BuddiedByUserId == user.UserId 
        select new { u.FirstName, u.LastName, u.SchoolName, u.UserId }; 

     var buddyviewmodel = new BuddyViewModel(buds //don't know what to put here); 

     return View(buddyviewmodel); 

的這部分代碼應該在模型或控制器中?

+1

有一個控制器,什麼都不能控制什麼?除了調用其他一些方法並將其他方法的結果傳遞給視圖外,其他操作方法只會讓我感到空間和時間的浪費。 –

+0

如果一個方法需要調用多次,並在控制器中聲明,發生了什麼,在每個控制器中我應該聲明! – Moslem7026

+1

當然,控制器顯然可以調用其他方法,這是代碼重用的其他原因。但是,除了將其結果傳遞給視圖之外,一個確切執行某個特定操作方法應該做什麼的方法將不可重用(除非您有兩個操作方法完全相同 - 這將非常糟糕)。 –

回答

3

理想情況下,此代碼屬於業務層。我通常在我的數據層(使用EF)和控制器之間創建一個服務層。該服務(例如,UserService)將域模型返回給控制器。控制器然後將其映射到ViewModel並返回視圖。通過這種方式,您可以將數據訪問從控制器中抽象出來,這樣您就不會有(相同的)LINQ查詢到處。

在你的情況下,控制器會看起來像:

Buddyship buddies = _buddyService.GetBuddiesByUserId(user.UserId); 
BuddyViewModel buddyViewModel = new BuddyViewModel(buddies); 
return View(buddyViewModel); 

對於非常小的項目,這個代碼是在控制器就好了,但絕對不是在你的領域模型類。

+0

所以你可以舉一些例子哪些數據應該在模型中定義? – Moslem7026

+0

@Moslem7026模型與模型 - 視圖 - 控制器一樣,它本身就是應用程序中的一個層,並且通常按照我的建議將其劃分爲子層,如數據訪問,業務邏輯(服務)以及您的域實體。我們通常也稱這些領域實體爲「模型」。這些實體被映射到數據庫中的表。 –

1

這個數量的代碼在你的控制器動作中沒問題。 MVC中的模型負責數據的業務邏輯,但實際檢索數據實際上是控制器的工作。由於像where子句和僅選擇某些列的事情會針對每個視圖的需求,因此將模型隱藏起來甚至沒有意義。理想情況下,該模型能夠服務於任何視圖(儘管視圖模型應該在模型中使用,以便封裝特定視圖的需求)。

0

在控制器是好的。如果該代碼需要重用,則將其移至服務類。