2011-03-06 11 views
2

我有一個基於MVC設計的Web應用程序。在MVC Web應用程序中,誰負責過濾大量對象,視圖或模型?

我有一個包含大量對象(論壇線程),我不能加載到內存中一次的數據庫。我現在想用不同的過濾器(有點像stackoverflow對按日期排序的問題,投票,標籤等)顯示(部分)這個集合。

我在哪裏實現過濾邏輯?在我看來,這必須進入應用程序的模型部分,因爲只有模型與數據庫交互(在我的實現中)。如果我將過濾作爲視圖的一部分,那麼視圖必須直接訪問數據庫以獲取過濾對象的列表,對吧?我想避免這種情況,因爲它將數據庫佈局暴露給視圖。但在同一時間,顯示相同數據的不同視圖在應用程序的視圖部分實現的,因爲他們是 - 不同享有相同數據的

那麼,如何解決這個問題?我是否創建了一個額外的模型,例如FilteredThreadsList,並記住要使用的過濾器,然後使用FilteredView顯示FilteredThreadsList吐出的線程列表?

還是我必須建立一個ThreadQueryier,使視圖查詢某一線程對象的數據庫,所以我可以在視圖中篩選邏輯不暴露後端數據庫?

+0

將濾波器邏輯放置在控制器和模型之間。讓你的控制器調用一個ActionResult返回方法,該方法返回模型中的輕量級實體,然後再返回到你的視圖。 – CarneyCode 2011-03-06 09:08:29

+0

你在談論** asp.net ** mvc嗎? – gideon 2011-03-06 09:33:45

+0

不,不是asp.net mvc,我的問題是(或應該是)語言和框架不可知論的。事實上,由於各種原因,我根本沒有使用任何現有的mvc框架,我正在手動完成。 – JeSuisse 2011-03-06 11:17:25

回答

1

從架構的角度來看,型號應該有過濾代碼。這是如此,因爲在許多應用程序中,用於過濾的代碼不是微不足道的,並且具有大量的域邏輯。 (想想從股票列表中篩選最高漲幅的股票)。從你的例子看,它看起來是相同的,因爲你可能想要按照投票或日期或標籤過濾,然後通過回答或未回答等。

在一些非常簡單的應用程序中處理搜索/實體列表和允許實體的創建/讀取/更新/刪除,分頁,排序和過濾邏輯通常非常通用,並且可以在由所有特定於實體的控制器類繼承的控制器基類中實現。

底線是這樣的:如果你的過濾邏輯是通用的,把它放在控制器中,否則把它放在模型中。

2

永遠不要從視圖中查詢數據。我不知道你正在使用什麼框架,但是對於Ruby on Rails(對於其他框架應該是相同的),我們總是從控制器中提取必要的數據並將所有信息存儲到變量中。該變量將被視圖訪問,這可以幫助您避免直接從視圖查詢數據庫。如果查詢數據庫的代碼在控制器中變得太冗長,請將該代碼插入到模型中,以便在您的項目中更易於維護未來。此外,如果需要,您可以從應用程序中的多個位置調用此模型方法。祝你好運!

0

型號,這是實體的只有一堆。

查看提供了模型中數據的可視化表示形式 - 根據需要使用盡可能多的視圖。如果您的應用程序是基於Web的,那麼您只需使用一次(AJAX)就可以將數據提取到瀏覽器中,並將它們重用到瀏覽器中呈現的不同UI組件。

至於什麼實體和用什麼視圖來表示,我認爲它的工作原理是控制器。如果您在「模型圖層」上需要一些支持,請添加它,但避免緊密耦合。