ASP.NET MVC 利用AreaRegistration进行Area区域模块化开发
背景資料:
隨著業(yè)務(wù)的需要,結(jié)構(gòu)需求越來(lái)越多,View文件夾下的文件夾也越來(lái)越多,又或者需要更改結(jié)構(gòu)的頁(yè)面路徑,另外可能是多個(gè)人合作開(kāi)發(fā),有多個(gè)WEB項(xiàng)目需要合并在一個(gè)網(wǎng)站中訪問(wèn)。
用Areas可以解決上述問(wèn)題,在項(xiàng)目中新建一個(gè)區(qū)域,就好像應(yīng)用了另外一個(gè)項(xiàng)目一樣,可以理解為當(dāng)前項(xiàng)目的子項(xiàng)目,其本質(zhì)就是一個(gè)子文件夾。就好比使用Area之前是把所有的文件夾放到一個(gè)文件夾中,使用了Area就相當(dāng)于使用了子文件夾來(lái)進(jìn)行管理,這樣,Areas就可以將復(fù)雜的網(wǎng)站模板化,有利于頁(yè)面的規(guī)范。
但是Areas又帶來(lái)了另外一個(gè)問(wèn)題:在同一個(gè)解決方案中使用多個(gè)Area,會(huì)造成程序的耦合性大大增加,當(dāng)多個(gè)開(kāi)發(fā)人員合作的時(shí)候,由于開(kāi)發(fā)人員的能力參差不齊,經(jīng)常會(huì)產(chǎn)生一個(gè)Area中的某個(gè)功能修改后,影響到了另一個(gè)Area,而且項(xiàng)目編譯后,bin目錄下只會(huì)產(chǎn)生一個(gè)此項(xiàng)目本身的DLL,這樣是非常不好的。如果能將某些Area分離出來(lái)自成一個(gè)項(xiàng)目,單獨(dú)進(jìn)行修改,單獨(dú)對(duì)其更新DLL,那就太棒了!本文就是要用簡(jiǎn)單的案例演示這個(gè)功能。
新建一個(gè)MVC項(xiàng)目,并且增加一個(gè)區(qū)域,命名為Report,如下圖所示:
? ? ? ? ? ? ? ? ? ? ? ? ??
在Report區(qū)域中隨便加個(gè)Control , View ,Model,反正是用來(lái)測(cè)試的,我添加的功能十分簡(jiǎn)單,就是在頁(yè)面上顯示一串字符串而已,如下圖所示:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
Model中的代碼如下圖所示:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ?Control中的代碼如下圖所示:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ?View中的代碼如下圖所示:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ??
? ?因?yàn)楣δ鼙容^簡(jiǎn)單,在瀏覽器中輸入路由路徑,功能顯示沒(méi)有問(wèn)題,如下圖所示:
? ? ? ? ? ? ? ? ??
接下去我要將Report區(qū)域分離出來(lái),首先,再新建一個(gè)MVC項(xiàng)目,命名為Report,如下圖所示:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
?刪除Report區(qū)域中其他文件,并且將WebApplication中Report區(qū)域下的ReportAreaRegistration文件復(fù)制到Report項(xiàng)目中,并去掉路由注冊(cè)的代碼,重復(fù)的路由注冊(cè)會(huì)報(bào)錯(cuò)?,Report項(xiàng)目的目錄如下圖所示:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
?ReportAreaRegistration.cs文件中的代碼如下圖所示:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
將?WebApplication中Report區(qū)域下的Control文件和Model文件剪切到 Report中,View文件不需要剪切,如下圖所示:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
修改OneViewModel中的命名空間,如下圖所示:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
修改ReportOneControl中對(duì)OneViewMode引用的命名空間,如下圖所示:
? ? ? ? ? ? ? ? ? ?
?修改OneView中對(duì)OneViewModel引用的命名空間,如下圖所示:
? ? ? ? ? ? ? ? ? ?
重新編譯Report項(xiàng)目生成Report.dll后,?WebApplication1項(xiàng)目引用Report.dll,如下圖所示:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
到這里已經(jīng)完成了,Report相關(guān)的model 和 control代碼已經(jīng)剝離了,運(yùn)行后結(jié)果和原來(lái)一樣:
? ? ? ? ? ? ? ? ?
至于?AreaRegistration 的原理,目前還在研究中,感覺(jué)路由是跟命名空間有關(guān)系的,只要在同一命名空間下Control,即便被剝離出源項(xiàng)目,還是能引用到的。以下是摘抄來(lái)的一段話:AreaRegistration類型會(huì)將其所在的命名空間保存在DataTokens["Namespaces"]中,在接收請(qǐng)求的時(shí)候就只會(huì)在這些命名空間或子空間中尋找controller,如果命名空間寫(xiě)錯(cuò)了,當(dāng)然就無(wú)法識(shí)別了。因此實(shí)際上area注冊(cè)僅僅起到的作用是,將area的名字和命名空間關(guān)聯(lián)起來(lái)。因此如果要導(dǎo)航area中的controller必須首先提供area名字,這樣就不會(huì)找到其他命名空間下的controller了,它必須先去找你的area名字,它的機(jī)制是這樣的。
總結(jié)
以上是生活随笔為你收集整理的ASP.NET MVC 利用AreaRegistration进行Area区域模块化开发的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 面试题:MySQL的innodb和myi
- 下一篇: asp.net ajax控件工具集 Au