2011-01-11 20 views
1

我在做一個代碼審查今天可以看到含有,除了數據包含不同方法的視圖模型類,有人喜歡有沒有把邏輯(方法)到視圖模型類

GetTable, GetPdf, LoadSomeData etc. 

任何好的理由我個人不喜歡它,因爲更喜歡有一個「普通」視圖模型類,只包含屬性並將邏輯放入控制器或附加服務。

但在審查我不可能找到好的理由。

你覺得,在視圖模型類中有一個邏輯的好方法(樣式)嗎?什麼是優點/缺點?

編輯:這是ASP.net MVC2應用程序。 編輯:實例(剛從頭)這種代碼的..

public ActionResult SomeAction() 
{ 
    var model = new ViewModel(); 
    model.LoadSomethingFromSomething(); 
    model.AnotherMethod(); 

    return View(model); 
} 

回答

1

我曾經訂閱完全「愚蠢」的模型的想法.. I.E那些不做任何事情。然而,在實踐中使用這個想法後,我發現它並不理想。我現在訂閱viewModels應該知道如何從其他對象創建自己的想法。

I.E.

public ActionResult SomeAction(int? id) 
{ 
    var serviceModel = _myService.Get(id ?? 0); 
    var model = new ViewModel(serviceModel); 

    return View(model); 
} 

基本上,而不是添加方法模型,創建多個構造函數,從而採取在視圖模型的創建中使用的對象。這使您的控制器免於瞭解有關viewModel如何工作的任何信息(意味着沒有對象映射代碼包含所有內容)。

然後,爲了獲得一個對象從視圖模型,你可以做到以下幾點:

[HttpPost] 
public ActionResult SomeAction(ViewModel model) 
{ 
    _myService.Update(model.MapToServiceModel()); 

    return SomeAction(model.id); 
} 
+0

這是一個很好的答案。我仍然相信「傾銷」的車型其他的則在控制器和服務中。 –

1

你的問題讓人感到模糊了我。當你說視圖模型時,你的意思是從視圖消耗的域模型構建的視圖特定模型?在這種情況下,我同意視圖模型應該非常簡單。觀點不應該「思考」很多(理想情況下,它不應該「思考」)。從視圖調用方法(這些方法在助手中沒有定義),甚至在視圖中分支,對我來說都是一種代碼味道。

IMO,控制器也應該薄且輕。我喜歡我的邏輯的真正大部分在我的模型和數據訪問層。取決於我們正在談論的是什麼類型的邏輯。

+0

是的,我的意思是查看具體型號 –

2

分離的顧慮單一職責主要的主要決定了應包含在視圖中唯一的「邏輯」應該是其操縱如何視圖顯示數據。其他一切都應該在控制器中。在語義上,該視圖執行一件事 - 顯示數據,與顯示所述數據無關的任何內容 - 即操縱數據,格式化數據,加載數據,轉換數據等應由控制器處理。

在現實世界中,我們並不總是有理想主義的奢華,但在理想世界中,這是它應該的方式。 最不感到意外的原因是,代碼應該在最不令人驚訝的地方找到它。如果我(作爲代碼維護者)需要修復某些內容,我需要能夠快速找到它 - 如果不是邏輯規定的地方我會找到它,它會爲我快速高效地完成任務提供不必要的障礙。

如果GetTable屬於加載視圖的表格構造(即HTML表格),那麼也許它是相關的,如果我們正在討論從數據庫獲取表格數據,那麼它不是。

相關問題