天天看點

.NET/ASP.NET MVC(子產品化開發AraeRegistration)1】開篇介紹2】AreaRegistration注冊路由(傳遞路由上下文進行子產品化注冊)

閱讀目錄:

1.開篇介紹

2.AreaRegistration注冊路由(傳遞路由上下文進行子產品化注冊)

ASP.NET Routing 路由功能非常強大,設計的也很巧妙;如果說ASP.NETMVC是建立在ASP.NET之上還不如準确的說ASP.NETMVC是建立在Routing基礎之上的,才使得Controller順利被找到并且執行Action;

那麼今天這篇文章是一個簡短的介紹如何在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中,然後是業務功能的劃分,但是大型站點也許需要這麼做;

下面我們來分析一下AreaRegistration的對象結構,至少我們要搞清楚如何使用這個對象及相關的對象;

1

2

3

4

5

6

7

8

9

10

11

12

13

<code>using</code> <code>System;</code>

<code>using</code> <code>System.Web.Routing;</code>

<code>namespace</code> <code>System.Web.Mvc</code>

<code>{</code>

<code>    </code><code>public</code> <code>abstract</code> <code>class</code> <code>AreaRegistration</code>

<code>    </code><code>{</code>

<code>        </code><code>protected</code> <code>AreaRegistration();      </code>

<code>        </code><code>public</code> <code>abstract</code> <code>string</code> <code>AreaName { </code><code>get</code><code>; }</code>

<code>        </code><code>public</code> <code>static</code> <code>void</code> <code>RegisterAllAreas();</code>

<code>        </code><code>public</code> <code>static</code> <code>void</code> <code>RegisterAllAreas(</code><code>object</code> <code>state);</code>

<code>        </code><code>public</code> <code>abstract</code> <code>void</code> <code>RegisterArea(AreaRegistrationContext context);</code>

<code>    </code><code>}</code>

<code>}</code>

這是AreaRegistration對象的代碼結構,兩個靜态的重載方法是用來在Gloab.asax檔案中啟動全局注冊用的,而帶object state 參數的是用來傳遞到我們将要繼承的對象中去的;然後剩下的一個AreaName屬性、RegisterArea方法是需要我們去實作的;

其實熟悉設計模式的朋友都會對這種模式很熟悉,因為它是最典型的模闆方法模式,也是設計原則中的依賴倒置原則,在内部MVC隻依賴AreaRegistration對象,然後将通過RegisterArea方法将AreaRegistrationContext上下文傳遞到子類中去執行點東西;

這裡需要強調的是,一個AreaRegistration對應一個獨立的AreaRegistrationContext對象,相關的參數是在構造函數中傳入的,前提是你必須實作AreaName屬性;

我們來實作一個OrderAreaRegistration對象,讓其繼承AreaRegistration抽象類;

14

15

16

17

18

19

20

21

22

<code>using</code> <code>System.Collections.Generic;</code>

<code>using</code> <code>System.Linq;</code>

<code>using</code> <code>System.Text;</code>

<code>using</code> <code>System.Threading.Tasks;</code>

<code>using</code> <code>System.Web.Mvc;</code>

<code>namespace</code> <code>Api.Order</code>

<code>    </code><code>public</code> <code>class</code> <code>OrderAreaRegistration : AreaRegistration</code>

<code>        </code><code>public</code> <code>override</code> <code>string</code> <code>AreaName</code>

<code>        </code><code>{</code>

<code>            </code><code>get</code> <code>{ </code><code>return</code> <code>"Aip/Order"</code><code>; }</code>

<code>        </code><code>}</code>

<code>        </code><code>public</code> <code>override</code> <code>void</code> <code>RegisterArea(AreaRegistrationContext context)</code>

<code>            </code><code>context.MapRoute(name: </code><code>"api.order.default"</code><code>, url: </code><code>"api/order/{controller}/{action}/{orderid}"</code><code>,</code>

<code>                </code><code>defaults: </code><code>new</code> <code>{ controller = </code><code>"OrderController"</code><code>, action = </code><code>"GetOrderOperationDatetime"</code><code>, orderid = </code><code>"1001"</code> <code>},</code>

<code>                </code><code>namespaces: </code><code>new</code> <code>string</code><code>[] { </code><code>"Api.Order"</code> <code>});</code>

定義在api項目中的Controller:

<code>    </code><code>public</code> <code>class</code> <code>Order : Controller</code>

<code>        </code><code>public</code> <code>string</code> <code>GetOrderOperationDatetime(</code><code>string</code> <code>orderId)</code>

<code>            </code><code>if</code> <code>(orderId.Equals(</code><code>"1001"</code><code>))</code>

<code>                </code><code>return</code> <code>DateTime.Now.ToString();</code>

<code>            </code><code>else</code>

<code>                </code><code>return</code> <code>orderId;</code>

然後我們得引用這個Library項目,這樣它才能在啟動的時候去自動的掃描到我們這個類型;

圖1:

<a href="http://blog.51cto.com/attachment/201310/122845484.jpg" target="_blank"></a>

AreaRegistrationContext是使用AreaRegistraton的實作類的參數AreaName作為參數的一部分來構造特定的Context對象的;AreaRegistratioContext是表示一個區域的上下文,我們在Context裡面注冊的動東西都是屬于目前Area的,它包括自己的Route集合;

圖2:

<a href="http://blog.51cto.com/attachment/201310/122930369.jpg" target="_blank"></a>

站點順利的路由到了我們在api.order項目中定義的OrderController;

圖3:

<a href="http://blog.51cto.com/attachment/201310/122949400.jpg" target="_blank"></a>

這麼來設計項目也是會多一中選擇的;

 本文轉自 王清培 51CTO部落格,原文連結:http://blog.51cto.com/wangqingpei557/1308648,如需轉載請自行聯系原作者

繼續閱讀