快速入门系列--MVC--03控制器和IOC应用
? ? Asp.net MVC也接觸好久了,但由于自己一直主要負(fù)責(zé)后臺,尤其是數(shù)據(jù)庫方面的工作對于該框架并沒有一個(gè)很好的了解,尤其是蔣金楠大師的ASP.NET MVC4框架剖析一書都買了2年多了,真正認(rèn)真看過并實(shí)踐過的也就第一章而已。最開始的時(shí)候還老認(rèn)為這本書不好,又厚又晦澀,不容易堅(jiān)持讀完,現(xiàn)在回想起來都覺得羞愧。標(biāo)準(zhǔn)的徒弟不好怪師傅的心態(tài),當(dāng)然學(xué)習(xí)的確需要一個(gè)過程,從淺入深會(huì)越來越喜歡。到目前為止,我最喜歡的書籍系列依然是入門經(jīng)典系列,內(nèi)容簡單有習(xí)題,方便記憶與實(shí)踐。最近有一段學(xué)習(xí)JAVA的過程,讓我慢慢開始學(xué)著閱讀源碼,這才知道蔣大師是源碼級別的剖析,并且比很多相關(guān)書籍好的地方時(shí),基本上每一個(gè)復(fù)雜的知識點(diǎn)他都會(huì)根據(jù)自己的理解創(chuàng)建一個(gè)相對簡單的小例子促進(jìn)讀者的理解,真心是棒棒噠。閑扯了半天,進(jìn)入今天的正題—ASP.NET MVC與IOC的相關(guān)實(shí)踐。
????首先由于IOC是在Controller這章介紹,所以先來說說Controller方面的相關(guān)知識。ASP.NET MVC框架的主要的處理過程就是通過解析URL信息獲取Controller的名稱和Action的名稱,同時(shí)通過Model的綁定機(jī)制將請求上下文所包含的請求數(shù)據(jù)轉(zhuǎn)化為Action方法調(diào)用的參數(shù)列表。這兒想提及的一點(diǎn)就是關(guān)于Controller的執(zhí)行是同步的還是異步的,實(shí)際上默認(rèn)情況下是異步的,其中DisableAsyncSupport屬性負(fù)責(zé)控制,默認(rèn)為false,我之前為這塊也困惑了很久。接下來提及的是ControllerFactory類中的SessionStateBehavior屬性,有Default、Required、ReadOnly、Disable,到目前為止,我對于該框架中的會(huì)話仍然不是特別的清楚,之后弄清后回過來修改。
接下來用簡圖表示Controller激活的基本過程,請求到來后,HttpModule進(jìn)行攔截,通過MvcRouteHandler調(diào)用GetHttpHandler方法找到對應(yīng)HttpHandler處理類,即MvcHandler。然后調(diào)用該類的異步處理方法,注意這兒會(huì)始終使用異步處理方式,該方法中首先通過ControllerBuilder對象獲取當(dāng)前的ControllerFactory,然后通過控制器的名稱找到并創(chuàng)建該控制器,讓后調(diào)用[Begin]Execute執(zhí)行,可以異步也可以是同步執(zhí)行,之前有提及。Controller在執(zhí)行完后,ControllerFactory會(huì)調(diào)用Release將其釋放。
再則說說Controller類型的緩存,為了提高解析Controller的效率,框架對其進(jìn)行了緩存,是一種XML文件形式的緩存,可以%Windir%\Micrisoft.NET的相關(guān)子目錄中找到,與AreaRegistration的緩存方式類似,需要時(shí)將該XML文件反序列化為一個(gè)List<Type>對象即可。
最后介紹,本文的重點(diǎn)Controller中IOC的應(yīng)用。在此之前,需要介紹一下應(yīng)用IOC的原因,在實(shí)際的開發(fā)過程中,用戶的請求會(huì)直接發(fā)送到Controller,這是如果是針對某項(xiàng)業(yè)務(wù)功能的調(diào)用,Controller會(huì)直接調(diào)用Model(也可以是外部的Service),當(dāng)需要呈現(xiàn)數(shù)據(jù)時(shí),回見Model中獲得數(shù)據(jù)轉(zhuǎn)化為ViewModel的形式用于呈現(xiàn)。但不管怎樣,Controller都會(huì)與業(yè)務(wù)層的Model(領(lǐng)域模型)產(chǎn)生直接的依賴,不復(fù)合程序設(shè)計(jì)中依賴倒置的原則,因此引入IOC,降低耦合性。
????在IOC的應(yīng)用上,我們選擇框架默認(rèn)的DependencyResolver組件與Unity組件的組合,當(dāng)前Unity組件已從codeplex搬到了github。有一個(gè)UnityMvc包原生支持IOC都不需要代碼,直接配置即可,但由于版本兼容原因,附實(shí)現(xiàn)的代碼如下,相關(guān)內(nèi)容比較簡單,就不介紹了。這兒的重點(diǎn)是相關(guān)整合方案有很多,這種是被使用最多的,當(dāng)然蔣老師介紹的與Ninject的組合也很好。
?View Code?
參考:
[1]蔣金楠. ASP.NET MVC4框架揭秘[M]. 上海:電子工業(yè)出版社, 2012. 86-122
轉(zhuǎn)載于:https://www.cnblogs.com/zhangyubao/p/7008745.html
總結(jié)
以上是生活随笔為你收集整理的快速入门系列--MVC--03控制器和IOC应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hibernate ORM框架学习日记基
- 下一篇: [Leetcode] Copy list