|
在正式的工作中使用ASP.NET MVC也有一陣子了,也看了聽了很多關(guān)于ASP.NET MVC別人的想法和代碼,我認(rèn)為很多人對(duì)于它的理解是錯(cuò)誤的。
在這里我只談?wù)剬?duì)ASP.NET MVC我的一些想法,希望大家多多討論。
1. ASP.NET MVC區(qū)別于ASP.NET在于設(shè)計(jì)理念
我聽過的關(guān)于ASP.NET MVC的第一個(gè)看法是ASP.NET MVC最大的特點(diǎn)在于Controller和View的分離,當(dāng)時(shí)我還不懂ASP.NET MVC是什么東西,但是當(dāng)我第一眼看到這個(gè)框架時(shí),我就認(rèn)為這個(gè)觀點(diǎn)是錯(cuò)誤的,我認(rèn)為ASP.NET MVC最大的特點(diǎn),也是最大的優(yōu)點(diǎn)是由Controller來驅(qū)動(dòng)整個(gè)項(xiàng)目的開發(fā)進(jìn)展。
我們知道,在一個(gè)項(xiàng)目的面向?qū)ο蠓治雠c設(shè)計(jì)過程中,我們一直都在圍繞著人,可能是角色,也可能是涉眾來分析和設(shè)計(jì)整個(gè)項(xiàng)目。人,全都是人!站在整個(gè)類設(shè)計(jì)結(jié)構(gòu)最上層的就應(yīng)該是人,然后我們接下來應(yīng)該去分析這個(gè)人有什么特征,我們這個(gè)人要做什么(記住,而不是這個(gè)人可以做什么)。也就是說,除了人之外,接下來的層次就應(yīng)該是這個(gè)人的行為,也就是整個(gè)系統(tǒng)中的Action。
好,接下來我們可以回想一下我們最初的ASP.NET Webform時(shí)代,我們是如何開發(fā)一個(gè)系統(tǒng)的,我們寫出一堆設(shè)計(jì)文檔,然后美工給我們頁面,然后就是我們常說的“套頁面”。對(duì)于這個(gè)做法,也就是我在之前文章中調(diào)侃的“PDD”(頁面驅(qū)動(dòng)開發(fā))。缺點(diǎn)我就不說了,在前文中我想我已經(jīng)說得很清楚了。
那么我們想想,其實(shí)我們會(huì)覺得Webform是個(gè)天然為了PDD而生的產(chǎn)物。當(dāng)提及三層架構(gòu)時(shí),很多人都有一種看法是ASP.NET本身就是三層的,我們暫且不管這個(gè)說法對(duì)不對(duì),至少可以說明,很多人都天然地把.ASPx.cs當(dāng)成了其中的一層,這就造成了ASPx和ASPx.cs這兩層的完全耦合性。
但是ASP.NET MVC好在哪里?一個(gè)用戶訪問,并不是在訪問某一個(gè)頁面,而是在訪問某一個(gè)功能(Action)。這就是面向?qū)ο蠓治龅淖罨A(chǔ)方法。
那么我們?cè)陂_發(fā)ASP.NET MVC時(shí)就應(yīng)該先考慮我們需要哪些功能塊,這就是我們的Controller,然后在這個(gè)功能塊下,我們都需要哪些功能,這就是我們的Action。至于頁面,應(yīng)該是應(yīng)該由功能來驅(qū)動(dòng)我們的頁面開發(fā),這才是Controller驅(qū)動(dòng)整個(gè)項(xiàng)目開發(fā)的核心!
但是我想仍然有很多公司在用開發(fā)ASP.NET時(shí)的那一套PDD來開發(fā)整個(gè)項(xiàng)目,我想,這就是沒有掌握到ASP.NET MVC的精髓之所在吧。
ASP.NET MVC要點(diǎn)一:先開發(fā)Controller,頁面完全可是先束之高閣,由Controller而不是Page來驅(qū)動(dòng)整個(gè)項(xiàng)目開發(fā)。
2. Controller的代碼組織
在整體的架構(gòu)中,個(gè)人認(rèn)為Controller更像一個(gè)Facade,他提供給用戶一個(gè)訪問接口,在這個(gè)接口背后是復(fù)雜的業(yè)務(wù)邏輯。
但是我看到很多公司的代碼都在Controller摻雜進(jìn)了復(fù)雜的業(yè)務(wù)邏輯,甚至?xí)霈F(xiàn)了幾百行,幾千行的Controller,這是我沒辦法理解的。
讓我們想想Facade,他的目的是這樣的:定義一個(gè)高層接口,這個(gè)接口使這一子系統(tǒng)更加容易使用。
在我看來應(yīng)該注意這樣幾點(diǎn):
A. Controller中不應(yīng)該包含任何private和protected方法,一個(gè)Facade類只應(yīng)該由對(duì)外暴露的方法,他只是對(duì)其他類方法的整合。
B. Action不應(yīng)該處理任何細(xì)節(jié)方面的邏輯。個(gè)人認(rèn)為,每個(gè)方法之中僅應(yīng)包含他下一抽象層次的方法,而不應(yīng)該出現(xiàn)抽象層次的雜糅以及抽象的層次跳躍。
C. Action本身其實(shí)就是一個(gè)方法,正如代碼規(guī)范上所說的,方法應(yīng)該只是動(dòng)詞或者動(dòng)賓短語,而不應(yīng)該出現(xiàn)名詞作為方法名的情況。因?yàn)?span style="color: #ff0000;">用戶是希望做某一項(xiàng)動(dòng)作,而不是得到某一種東西。
3. 最后
本來感覺有好多話想說,可是寫著寫著卻發(fā)現(xiàn)不知道該寫什么了,下次再說吧。
最后,個(gè)人建議,學(xué)習(xí)ASP.NET MVC可以參考一下Java界的一些成熟思路,有些其實(shí)和ASP.NET MVC非常像,比如Struts,還有Spring MVC。
打算接下來的時(shí)間看一下。歡迎大家共同討論學(xué)習(xí)。
NET技術(shù):淺談ASP.NET MVC,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。