閱讀目錄:設計模式
ASP.NET Routing 路由功能很是強大,設計的也很巧妙;若是說ASP.NETMVC是創建在ASP.NET之上還不如準確的說ASP.NETMVC是創建在Routing基礎之上的,才使得Controller順利被找到而且執行Action;api
那麼今天這篇文章是一個簡短的介紹如何在ASP.NETMVC下進行很好的模塊化開發,都知道ASP.NETMVC是分層架構中的UI層框架;而UI層的開發有着天生的難以控制性,尤爲是WEBUI和WINFORMUI有着很大的區別;WEBUI的組成元素多,又是在遠程的瀏覽器中處理的,因此仍是很考驗架構設計的;瀏覽器
那麼ASP.NETMVC的AreaRegistration是用來幹什麼呢,它是用來提供一個很好的接口讓咱們能夠將Controller定義在其餘的Library項目中,這主要能夠用來解決模塊化開發;通常狀況下咱們不多將全部的東西都定義在WebApplication中,而是會根據業務須要或者架構須要劃分出一系列的Library項目來,從而讓咱們的邏輯架構更清晰也讓物理架構的設計很靈活點,好比:橫向的擴展,動態設計業務模塊,WEBAPI等等;架構
可是Routing跟MVC沒有必然的關係,都是能夠經過擴展的方式嵌入各自想要的功能點,Routing是在提供自定義IHttpModule的方式將控制權拿到,而MVC是創建在Routing的基礎上讓Uri的路由爲本身所用,其實準確點講AreaRegistration適當的擴展能夠用在不少的場合下,可是畢竟AreaRegistration是在ASP.NETMVC中提供出來的;框架
簡單的解釋,AreaRegistration是用來在ASP.NETMVC裏面註冊多個區域的方式;就是能夠將一個大型的MVC站點劃分紅多個Area區域,而後各自的Area有着本身的Controller、Action、View等元素;可是通常狀況咱們並不會那麼作,由於將站點的全部UI層中的元素切開放會給維護工做帶來很大的工做量,並且咱們約定俗成的是UI層的東西放在一個主的WebApplication中,而後是業務功能的劃分,可是大型站點也許須要這麼作;ide
下面咱們來分析一下AreaRegistration的對象結構,至少咱們要搞清楚如何使用這個對象及相關的對象;模塊化
1 using System; 2 using System.Web.Routing; 3 4 namespace System.Web.Mvc 5 { 6 public abstract class AreaRegistration 7 { 8 protected AreaRegistration(); 9 10 public abstract string AreaName { get; } 11 public static void RegisterAllAreas(); 12 public static void RegisterAllAreas(object state); 13 public abstract void RegisterArea(AreaRegistrationContext context); 14 } 15 }
這是AreaRegistration對象的代碼結構,兩個靜態的重載方法是用來在Gloab.asax文件中啓動全局註冊用的,而帶object state 參數的是用來傳遞到咱們將要繼承的對象中去的;而後剩下的一個AreaName屬性、RegisterArea方法是須要咱們去實現的;函數
其實熟悉設計模式的朋友都會對這種模式很熟悉,由於它是最典型的模板方法模式,也是設計原則中的依賴倒置原則,在內部MVC只依賴AreaRegistration對象,而後將經過RegisterArea方法將AreaRegistrationContext上下文傳遞到子類中去執行點東西;url
這裏須要強調的是,一個AreaRegistration對應一個獨立的AreaRegistrationContext對象,相關的參數是在構造函數中傳入的,前提是你必須實現AreaName屬性;spa
咱們來實現一個OrderAreaRegistration對象,讓其繼承AreaRegistration抽象類;
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Web.Mvc; 7 8 namespace Api.Order 9 { 10 public class OrderAreaRegistration : AreaRegistration 11 { 12 public override string AreaName 13 { 14 get { return "Aip/Order"; } 15 } 16 17 public override void RegisterArea(AreaRegistrationContext context) 18 { 19 context.MapRoute(name: "api.order.default", url: "api/order/{controller}/{action}/{orderid}", 20 defaults: new { controller = "OrderController", action = "GetOrderOperationDatetime", orderid = "1001" }, 21 namespaces: new string[] { "Api.Order" }); 22 } 23 } 24 }
定義在api項目中的Controller:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Web.Mvc; 7 8 namespace Api.Order 9 { 10 public class Order : Controller 11 { 12 public string GetOrderOperationDatetime(string orderId) 13 { 14 if (orderId.Equals("1001")) 15 return DateTime.Now.ToString(); 16 else 17 return orderId; 18 } 19 } 20 }
而後咱們得引用這個Library項目,這樣它才能在啓動的時候去自動的掃描到咱們這個類型;
圖1:
AreaRegistrationContext是使用AreaRegistraton的實現類的參數AreaName做爲參數的一部分來構造特定的Context對象的;AreaRegistratioContext是表示一個區域的上下文,咱們在Context裏面註冊的動東西都是屬於當前Area的,它包括本身的Route集合;
圖2:
站點順利的路由到了咱們在api.order項目中定義的OrderController;
圖3:
這麼來設計項目也是會多一中選擇的;
做者:王清培
出處:http://www.cnblogs.com/wangiqngpei557/
本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利。