2008-09-24 147 views
1

原諒模糊的標題,我不確定如何描述它。MVC模型設計/繼承

如果您有一個通用模型「歸檔」,您將如何基於用戶選擇的「類型」顯示不同的視圖/表單?

例如,用戶創建一個新的「存檔」,然後獲取視頻,書籍,音頻等的選擇。從那裏他們根據存檔類型獲得不同的表單。

或者將它們分成不同的模型比較好 - 視頻,書籍,音頻?

或者模型可以繼承(比如Video extends Archive)。我想這是基本的OOP /類,但不知道如何在這裏應用。

歡迎來自任何MVC框架的示例!

回答

3

好像你不希望有從存檔類型繼承。 「始終支持繼承的封裝/遏制」。

爲什麼不創建一個名爲存檔類,並給它一個類型屬性。類型可以使用繼承專門爲音頻,視頻等

這似乎是你會基於一些其他標準專門檔案。 「FileSystemArchivce」,「XMLArchive」,「SQLArchive」和類型不會更改。但我的敏捷人士說,這可能一開始並不需要,你可以隨時重構設計......

就控制器而言,你可能通過封裝差異來獲得最大的回報視圖中的每種類型的演示文稿。所以只有視圖根據類型而改變。可能每個人的語義和規則都是一樣的,你不需要爲每種類型分別設置控制器。對於每種類型,視圖都會有所不同,因爲它們具有不同的屬性。

3

您的模型視頻,圖書和音頻可以繼承存檔。

而且每個模型都會有一個控制器。

http://yourserver/Books/Edit/11

你必須讓你的用戶,您創建相應的模型前挑選他們想要的檔案類型。

EDIT(在響應評論)

在ASP.NET MVC模型將是一個類。

public class Video : Archive 
{ 
    public int Id {get;set} 
    public string Name {get;set;}  
    ... 
} 

您也將有一個控制器

public class VideoController : Controller 
{ 
    public object Edit(int id) 
    { 
     Video myVideo = GetVideo(id); 
     return View("Edit", myVideo); 
    } 
    ... 
} 

,你將不得不在例如瀏覽目錄視圖,其中包含

public class Edit : View<Video> 
{ 
    ... 
} 

所以你可以,如果調用此頁面你有一個網址是

http://localhost/Video/Edit/11

這一切都是從內存完成的,所以可能會出現一些錯誤,但回家的信息是您在模型中指定了繼承。該模型只是一個類。在你的情況下,你想從存檔繼承。一旦你完成了這個模型就像平常一樣傳遞。

+0

謝謝。你可以舉一個如何指定模型繼承的例子嗎? – meleyal 2008-09-24 19:27:20

0

在我看來,一個支持MVC的實質就是如果所有用戶需要的是不同的視圖,您可能不需要自定義模型(或控制器 - 其中只有一個控制器)。只有存儲(持久性)體系結構需要它時,纔會出現多個模型。如果您需要多個模型,某些功能(如數據訪問對象(DAO))可能會顯示爲控制器和模型之間的另一個層。

查看Apache Struts項目的示例。正如Struts for Newbies所述,「要充分使用Struts,重要的是要對基礎知識有一個很好的把握。首先檢查Key Technologies primer,並研究任何不熟悉的主題。「

對於其他資源,請參閱Web-Tier Application Framework Design(孫J2EE藍圖)

3

要真正表現出了不同的看法應該很容易在任何MVC框架。例如,在微軟ASP.NET MVC,你不會只返回一個視圖從類似下面的控制器:

return View(); 

但實際上會陳述視圖作爲參數的名稱:

return View("VideoArchive"); 

這將然後顯示從查看視圖/存檔/ VideoArchive.aspx

0

Single Responsibility Principle(PDF)指出:

永遠不應該有一個以上的理由採用類來更改。

您的存檔類違反了這個原則,通過處理多種不同類型的存檔。例如,如果您需要更新視頻存檔,您還正在修改處理書籍和音頻存檔的類。

適當的方式來處理,這是爲每個不同類型的歸檔文件的創建單獨的類。這些類型應該實現一個通用接口(或繼承一個公共基類),以便可以通過代碼來交換(多態)處理它們,這些代碼只關心歸檔,而不是特定的歸檔類型。

一旦你在地方類層次結構,你只需要爲每個模型類單個控制器和視圖。

獎勵積分的單一職責原則,甚至可以證明使用工廠方法或抽象工廠用於創建模型,視圖和控制器對象(而不是新-ING起來內嵌)。畢竟,創建對象並使用該對象是不同的責任,可能需要根據不同的原因進行更改。