自制MVC框架原理介紹


  當初用jsp開發程序時,因為很多東西寫在一起混淆的,項目做大或者變更的時候就會很吃力,聯動性太大,有時修改視圖的東西都可能會影響業務邏輯,分層不明確。

  后來聽說了Struts MVC,做過幾個示例,層次倒是分清了,每個actionbean或者interceptor都得配置映射,配置弄來弄去很麻煩,當然用配置的方式的話靈活性擴展性會好很多,但做起來實太吃力。再后來看到了Spring MVC 它可以省去很多配置,可以使用注解的方式去直接寫在程序了,實現了零配置。

  在dotnet方面原來一直沒有mvc這個概念只有webform,webform相對入門簡單,但要更高級的入門感覺沒那么簡單,而且webform不適合做web app。后來看到了MonoRail MVC,於是研究了一翻以后,決定自己弄一個適合自己的MVC框架,於是乎便產生了我自己的MVC,我命名是Stephen.View 其實名字叫Stephen.MVC更好些,但后來一直沒改,那就一直保持這個名字了。若干年后微軟也出了MVC,現在都已經有好幾個版本了。沒去研究過這個東東,項目中還是用我自制的這個框架。接下來說說我的框架實現原理:

 

通過在web.config中

        <httpHandlers>

            <add verb="*" path="*.aspx" type="Stephen.View.TemplateHandle,Stephen.View"/></httpHandlers>

 

攔截擴展名為.aspx的請求,讓Stephen.View.TemplateHandle(實現IhttpHandlerFactory接口的類)處理http請求,處理方式有以下幾步:

 

1.是否有url重寫(可在web.config中寫入配置),有的話根據配置后執行真實的處理url,沒有的話就跳過。

Web.config配置方式為:

<configuration>

    <configSections><section name="RewriterConfig" type="Stephen.View.UrlConfig.RewriterConfigSerializerSectionHandler, Stephen.View"/></configSections>

    <RewriterConfig>

        <Rules>

            <RewriterRule>

                <LookFor>~/article/cat/(\d+).aspx</LookFor>

                <SendTo>~/integration/info/CommonManageList_.aspx?ClassID=$1</SendTo>

            </RewriterRule>

        </Rules>

    </RewriterConfig>

    <connectionStrings>

 

url重寫可參考:http://www.cnblogs.com/netcorner/archive/2009/12/10/2912045.html

 

2.通過真實的url地址配置需調用哪個控制器(可通過web.config中配置控制組件前綴包名,默認控制層名字為Netcorner.Controllers)

<appSettings>

                   <add key="Controller" value="Netcorner.Controllers"/>

</appSettings>

 

注:控制層的方法默認是不具有session會話的,如需要會話的話控制層方法必須加入HasSessionAttribute 特性。

在調用控制層方法之前,會向控制層方法傳遞一個Hashtable對象,該對象存放了分別是當前應用路徑(key=applicationPath),當前路徑地址(currentFilePath),視圖應用處理包(key=Tools,視圖處理包可通過配置映射哪個處理包,默認就是Stephen.View.ViewUtility類)

 

3.調用控制器執行方法

控制器其實就是一個簡單的C#類,如:

namespace Netcorner.Controllers.integration

{

    public class User

    {

        public virtual IDictionary ManageList(IDictionary context)

        {

            ...

        }

    }

}

 

當執行/integration/user/managelist.aspx時就會執行User類中ManageList方法,context參數是從Stephen.View.TemplateHandle得到的。

控制器的寫法可有多種方式:

1).采用直接在方法體里面寫代碼

2).是寫插件(我這里把C#特性叫做插件了,這些插件把一些常見的業務封裝起來了,直接可以拿來調用)的方式。每個插件必須實現BeforehandCommonAttribute或ProceedPlugin抽象類。工作方式可參見后面章節。

3).通過配置的動態攔截器。攔截器必須實現AspectInterceptor抽象類,工作方式可參見后面章節。

4).控制器方法處理完成返回相應的值.

不同類型調用的方式不一樣

(1).返回Hashtable時

調用視圖模板。這里我處理的模板引擎用了nvelocity。語法參見:http://www.cnblogs.com/netcorner/archive/2008/07/11/2912125.html

(2).其它類型時,則以字符串形式直接展現不需要模板。

 

  控制層的訪問類是通過url傳遞的,在根目錄的話執行的類名必須是Default,其它的話就會根據包名和類名相匹配找到相應類下面相應方法。比如:/integration/user/login.aspx 它實際是訪問Netconer.Controllers.integration(我這里使用默認設定的控制器)包下的login方法

演示示例:http://files.cnblogs.com/netcorner/%E7%A4%BA%E4%BE%8B1.rar

 

接下來我會講一下插件及攔截器原理及開發方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM