MVC架構三大模組

來源:互聯網
上載者:User

標籤:partial   bind   結合   指定   app   and   actor   ken   位置   

1.Routing模組

Routing機制與MVC5的URL解析處理流程基本是相同的,很多的介面和類像IRouteHandler、IHttpHandler、IController 、RouteBase、RouteTable、RouteDictionary、DefaultControllerFactory以及AreaRegistration名稱是相同的功能是類似的,也可以是看做MVC5路由機制的簡化版本或者是Artech MVC5書中路由執行個體的強化版本。在Web項目的啟動階段,設定的路由模板(包括AreaRegistration中的)會被註冊到RouteDictionary中,AppDomain中所有實現了IController介面的類型都會被註冊到一個安全執行緒的集合中。

需要重點說明的時候,結合公司現有項目的實戰經驗(公司的開發規範),MVC項目的路由模板是很正規的,只能是這種形式Area/{otherParameter}/{controller}/{action}/{id},一個Segment只能是”/”或者純文字字串或者就單純是一個大括弧參數,不能即有參數又有文本字串類似”/{date}text{time}/”或者”/{*parameter}/{ohterParameter}/”等等會造成路由複雜的特性(也不能使用RouteAttribute)。也無需RouteConstraint。所以我在解析請求的Url的工作量也降低了不少。

通過遍曆緩衝的Route集合,以Request作為參數,調用Route的Match方法,對比每個Route中的UrlTemplate和請求Url的虛擬路徑,在文本字串相同,參數位置相符的情況下將請求Url的對應結果或者Route中的預設參數值儲存到RouteData的Values字典屬性中。在解析出Area,Controller還有Action之後會調用DefaultControllerFactory,依據所匹配Route的DataTokens字典中儲存的命名空間還有在項目中配置的預設命名空間來找到滿足命名空間還有Controller名的Type。執行個體化並執行。

2.Action的參數綁定及執行

Action參數配置了五個來源分別是RouteData,QueryString,FormValue,FileCollection還有一個JsonValue,在執行參數綁定的時候,依優先順序順序擷取使用者指定的特定參數類型的綁定,如果未設定則調用DefaultModelBinder作為預設的綁定。DefaultModelBinder實施綁定還是相當複雜的難以講述,同時在綁定的過程中還會執行ModelValidator,更新ModelState,總體而言,DefaultModelBinder會判斷Action的參數是簡單類型還是複雜類型,如果是複雜類型會使用反射解析出所有屬性遞迴調用直到分解成所有簡單類型執行綁定,所有複雜類型所分解出的屬性會以字串運算式()的形式傳入那五個資料來源來匹配是否有值,如果有就更新到ModelState。在表單中有時候需要上傳檔案,看到Nancy MVC架構中有套檔案上傳機制是通過解析Header中的boundary Token來獲得檔案Stream的就修改部分功能,並替換掉上下文然後加入到DrisionMVC中。

在完成參數的綁定後就開始執行Action的真正邏輯了,DrisionMVC為了提高效率,所有的Action都是以Action的MethodInfo為Key封裝Action的ActionMethodDispatcher為Value,儲存到一個安全執行緒的ActionMethodDispatcherCache字典中的,ActionMethodDispatcher的Execute方法會完成真正的邏輯執行,Action會被封裝到一個LamdaExpression中,形式為Func<object, object[], Task<object>>,該LamdaExpression同樣會被緩衝,被擷取執行就能返回正確的結果。

3.視圖cshtml檔案的編譯執行

View視圖檔案的編譯參照的是RazorEngine架構,所有的.cshtml檔案在被第一次編譯成C#類後都會被儲存到一個安全執行緒的字典中。該架構的大體運行流程是在控制器的Action方法中返回View()時會調用ViewResult類的ExecuteResult方法,該方法體中開始調用RazorEngine的編譯和執行功能,根據約定擷取到視圖.cshtml檔案的絕對路徑,以該絕對路徑和視圖Model的類型(不存在就為null)為組合key,尋找緩衝中是否存在已經編譯好的視圖執行個體,存在就直接返會視圖執行個體,執行視圖執行個體返回一個完整的html字串文本並寫入到Response的Body屬性中。如果不存在就會首先擷取到.cshtml檔案的全部文本,同時建立一個TypeContext的執行個體包含,Model的Type類型,還有被編譯產生的C#類的基類RazorTemplateBase<>還有所必需的的命名空間集合。傳入Roslyn編譯器產生真正的C#類型並儲存。不過現在還有一個問題就是在視圖cshtml中應用了@model ModeType之後調用@Html.TextBoxFor等等空間的時候沒有智能提示也是挺頭疼的,目前暫時使用@inherits來替代。

開發的過程中發現RazorEngine並沒有@Html(HtmlHelper)和@Url(UrlHelper)的協助類,所以在使用DrisionMVC開發Web項目就無法使用控制項了,像@Html.TextBox,@Html.DropdowList,@Html.Action還有@Url.Action之類的。所以在RazorTemplateBase<>基類中自訂了HtmlHelper,還有UrlHelper兩個屬性,所有控制項的Render機制都與MVC5隻是修改成使用OwinContext作為資料來源。另外子Action機制還有Partial也是比較複雜的,花了不少的精力。View視圖的兩大重量級的控制項DisplayFor,EditorFor因為公司裡面項目都為使用所以未添加。

經過幾個月的奮戰終於完成了這套MVC架構,在測試應用的過程中問題很少並且沒有出現架構級的錯誤造成某些MVC5常用功能無法實現,也是倍感欣慰。感覺學到了很多的東西,高內聚松耦合的思想也是頗有體會,也學習了不少架構開發的注意事項。

MVC架構三大模組

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.