|
最近流行MVC,不是因?yàn)榇蠹叶荚谟茫撬呀?jīng)在.NET缺席N多年。本文題目是亂取的,吸引眼球而已。
MVC是一個(gè)非常有爭議性的話題,首先,什么算是MVC,沒有一個(gè)統(tǒng)一的說法,眾說紛紜,Java,php都在爭吵不休,就跟別說已開始就壓根沒打算MVC的ASP.NET。在大家被微軟用CodeBehind和CodeBeside忽悠過去N多年之后,當(dāng)大家在對WebForm審美疲勞后,MVC就跟李宇春一般另類且充滿吸引力。最近的新聞是微軟也要在ASP.NET中推出MVC了。對于很多M飯來說是一個(gè)十分值的慶祝的事情。順帶著MonoRail也雞犬升天,關(guān)注的人越來越多。WebForm未死,MVC卻活過來了。
所以這就是我不得不來發(fā)表對MVC一下看法的原因。上帝說“你應(yīng)該了解真相,真相使你自由”,什么是MVC的真相呢?我想從來源說起,話說N多年前,在一個(gè)叫SmartTalk的國度出現(xiàn)了一個(gè)叫MVC的家伙,后來流竄到了Java國,在Java國里呼風(fēng)喚雨(Java的很多有界面的組件,比如swing都是采用MVC模式設(shè)計(jì)的)。
這個(gè)MVC是個(gè)什么樣的家伙?
首先,此人長了三只手。一只叫Model,它負(fù)責(zé)業(yè)務(wù)領(lǐng)域狀態(tài)的知識,一只叫View,負(fù)責(zé)業(yè)務(wù)領(lǐng)域的表示視圖,一只叫Controller,負(fù)責(zé)控制用戶輸入的流和狀態(tài)。當(dāng)模型某一部分發(fā)生變化的時(shí)候,通常使用事件通知表單來通知視圖。但是這個(gè)家伙在Web上操作的時(shí)候遇到了麻煩。因?yàn)閃eb的瀏覽器是沒有狀態(tài)的,所以模型沒有辦法通知視圖發(fā)生變化,而必須通過用戶發(fā)出另一次請求才能知道模型的改變。(以上內(nèi)容源自《jakarta struts編程》一書)
所以這個(gè)家伙就將我迷惑住了,如果用戶需要請求兩次,那整個(gè)過程入口在哪里?View還是Control?
在微軟忽悠的MVP中,其實(shí)ASPx文件和ASPx.cs都被混成了一個(gè)類,那么這個(gè)所謂的PageController和View(ASPx頁面)是耦合起來的。反過來看Java的MVC,在jsp2.0規(guī)范中,不允許直接請求jsp頁面而是需要通過Servlet來重定向,具體的效果先不說,起碼倒是把Controller和View分開了,而且也統(tǒng)一了入口,都是從控制器進(jìn)入的,那么控制器的職責(zé)也就很清晰了:
攔截http請求
將請求轉(zhuǎn)換成要執(zhí)行的具體業(yè)務(wù)邏輯的操作
判斷調(diào)用業(yè)務(wù)操作還是委托給處理程序
幫組用戶選擇要顯示給客戶端的下一個(gè)視圖
將視圖返回給客戶端
如果按照ASP.NET的WebForm來實(shí)現(xiàn)的話,那么4,5兩步就很讓人迷惑了,因?yàn)镃ontroller和視圖已經(jīng)牢牢的綁定在了一起,如何選擇,如果將請求轉(zhuǎn)發(fā),那么應(yīng)該也將請求轉(zhuǎn)發(fā)給了下一個(gè)控制器而不是視圖。
所以微軟用一個(gè)MVP來忽悠了之后,大家反而迷惑了。所以新人注意了,如果你開始學(xué)WebForm就千萬不要看MVC,否則也會(huì)被忽悠。至于微軟新出的MVC,沒用過,不做評論。這里我總結(jié)一下我的觀點(diǎn):
什么樣的框架算是MVC呢?
首先,M、V、C三部分的功能應(yīng)該符合:
Model,負(fù)責(zé)業(yè)務(wù)領(lǐng)域狀態(tài)的知識
View,負(fù)責(zé)業(yè)務(wù)領(lǐng)域的表示視圖
Controller,負(fù)責(zé)控制用戶輸入的流和狀態(tài)
由于Web下的限制,Controller應(yīng)該作為整個(gè)請求的入口,由Controller來組織業(yè)務(wù)邏輯(判斷請求和業(yè)務(wù)邏輯的對應(yīng)關(guān)系,最終的實(shí)現(xiàn)還是Model),而模型的改變通知視圖的功能也就應(yīng)該由Controller來轉(zhuǎn)達(dá)一次(沒辦法,Web的限制,由于Controller被作為了入口,那么模型通知視圖變化的事件也之只能由Controller來觸發(fā),或者也可以是Controller通知視圖模型變化了,然后視圖到模型去取數(shù)據(jù))。
其實(shí)從上面的分析看來,起碼來說視圖應(yīng)該能夠根據(jù)模型自己組織輸出的外觀而不必假手Controller,但是在ASP.NET中實(shí)際的操作看來,模型都是通過控制器在綁定數(shù)據(jù)。
之前很早就看過Henry Fan兄的Nclay,其中的MVC組件給出的例子還沒好生研究,所以在這里也期待Henry兄給出自己的寶貴意見。
NET技術(shù):混亂的MVC,.NET非要MVC不可么?,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時(shí)間聯(lián)系我們修改或刪除,多謝。