2016-02-16 28 views
2

在網絡上關於ASP.NET MVC的各種文章中,有人提到微軟的MVC實現與'傳統'MVC模式有某些不同。微軟的MVC實現不同於傳統的MVC模式

但是我從來沒有見過任何人對此有任何細節,乍一看我沒有看到ASP.NET MVC與描述的內容有什麼不同,比如here

所以我的問題是:ASP.NET MVC確實違反了任何MVC模式原則嗎?

+1

你能描述一下你認爲ASP.NET MVC的哪些部分不符合MVC設計原則嗎?否則恐怕這會變得非常有意義。或者圍繞這個問題,比如_「ASP.NET MVC是否實現了模型 - 視圖 - 控制器設計模式的核心原理?」。或者更適用於全球:_「HTTP應用程序是否可以並可行地從MVC設計模式中正確實現原則X,Y和Z?」。 – CodeCaster

+0

@CodeCaster,我的問題表明我不認爲ASP.NET MVC的任何部分違反了MVC設計原則。我的意圖是找出其他人認爲哪些部分違反了這一原則。 –

+0

_「其他人認爲」_ - 是的,所以這使得它以意見爲基礎。 – CodeCaster

回答

5

問題是MVC是一個鬆散定義的模式。 「M」可以被解釋爲「商業領域中的所有事物,從實體到商業邏輯」。

我不會說ASP.NET違反MVC,而是鬆散地解釋它。

一些官方MVC示例直接在控制器中使用實體框架,這在我看來是不正確的。因爲那樣它就不會成爲模型和視圖之間的橋樑。相反,它會照顧業務邏輯(即使它是非常基本的邏輯),並將模型信息映射到視圖。

ASP.NET MVC有一些稱爲視圖模型,它不是MVC中的M.它們被用作模型(或模型中更多實體中的一個)和視圖之間的適配器,從而接管了控制器所承擔的部分責任。

+1

因爲MVC是一種UI技術,我總是將「M」解釋爲視圖模型。業務邏輯可以位於單獨的層,Web服務甚至數據庫中。 – Ryan

+1

@Ryan:來自維基百科:MVC的核心部分是模型,它根據問題域捕獲應用程序的行爲,獨立於控制器中的用戶界面「 – jgauffin

+1

」實體框架,這在我看來是不正確的「 - 確實!域名在哪裏?而如果我不想在明天使用EF呢?所以,我們重複同樣的錯誤。我們有控制器,而不是中介或橋樑,現在它是BLL和DA –

1

一般來說,MVC模式的微軟實現遵循MVC模式的主要租戶。它有一個模型,控制器和視圖,負責UI的略有不同方面(記住MVC是在這種情況下的演示模式,所以它只負責UI(主要))

微軟開始偏離的地方是引入的一些不太清潔(如在不是100%MVC)的特點,特別是

上面的一些人比其他人更具爭議性。最終,所有這些事情都旨在加快開發速度,但遠離控制器構建視圖然後渲染的模型的想法(完全停止)。

微軟也有將MVC解釋爲業務邏輯模式的傾向(如上所述,它是一種UI模式)。

因此,在微軟的世界中,您經常會看到控制器從中獲取模型的示例(例如)Entity Framework會執行一些業務邏輯(業務邏輯不應該真正在控制器中),然後將其傳遞到ViewModel真正的100%MVC),然後視圖呈現它(使用幫助函數操縱數據)。

因此,他們嘗試和出售MVC作爲一種模式適合所有解決方案時,它不是。

1

雖然我同意其他答案[在某些方面],讓我把它放在一個不同的角度。

ASP.NET MVC是不是一個模式而是框架中,你可以寫你的軟件使用MVC模式,或者更確切地說,它的特定Web程序的版本。

您不應該擔心微軟的實施。他們的MVC框架的實現與MVC模式無關。爲了實現它,MS肯定會使用許多不同的模式。這裏的關鍵是瞭解MVC框架不是MVC。它允許您使用MVC模式進行開發。在這種情況下,這種模式包含了一些您需要遵循的規則,例如其他模式 - 例如最後使用Controller的名稱控制器。但這是MS爲你實施的。所以,你有視圖,模型和控制器。 MVC框架告訴你,遵循規則,我們將爲你連接所有這些。

現在,如果您將MVC模式轉換爲原始模式,它會告訴您 - 與控制器和模型分開顯示。和控制器分開的模型。因爲這樣,例如,您可以在不同視圖中重新使用模型和控制器。現在,你如何實現它 - 取決於你。只要它具有我上面描述的特徵,這就是MVC。所以,MS再次給了你MVC框架,其中你有單獨的M-V-C。因此,當你寫你的M,V和C時,你有分離,這是原始模式描述。 MVC框架爲您處理佈線。