自從吾修主頁上發布了QMVC1.0,非常感興趣,用了半月的時間學習,真的感覺收益非淺,在此聲明非常感謝吾修大哥的分享!
1、輕快簡單,框架就幾個類,簡單,當然代碼少也就運行快!單純的MVC,使的如果你想擴展框架,可以輕易的在QMVC上增加和減少功能,也就是說更容易的去修改和讀懂源碼。
2、可以與webform框架融合,也就是說你用webform和mvc共同在同一個項目中運行。
3、QMVC APP開發,QMVC APP可以輕易實現多個QMVC項目合並到一個項目中運行,也可以輕易將其分離開獨立運行,比如一個網站常有論壇、文章系統、新聞系統等,如果你的程序用qmvc app,哪么可以輕易實現多個系統的融合。
本文主題:“QMVC高級開發”,所謂高級我可不認為就是學不會,搞不懂的忽悠者是高級!而是高與初級的層面上知識,所以在此,我假設你己經懂了QMVC的基礎級應用,如果想了解QMVC的初級應用,可以參考我寫的一篇文章《高性能.NET MVC之QMVC》,或QMVC官網(www.wuxiu.org)。
怎樣的框架是最適合你的?哪么豪無疑問,最適合你的框架,什么是最適合自己的?肯定是量身定制的!就像是如果說qmvc,他的代碼非常少,層次簡單,邏輯清晰,簡單。你可以通過基於QMVC輕易擴展成適合自己系統的框架!本文就談談如何擴展自己的MVC APP框架、談談QMVC源碼結構!
1、QMVC源碼分析
首先QMVC源碼中存在兩種MVC模式,一種是QMVC基本框架,一種是QMVC APP框架,QMVC APP的代碼是基於QMVC基本框架實現的,源碼中APPS目錄中存的是關於QMVC APP框架的實現代碼。根目錄下是QMVC基本框架,Router為QMVC的路由功能,用HTTP請求地址的分析。
ControllerBase類 所有控制器的基類
IMVCModel 模型調用接口,當然你的Model也可以不繼承於此接口,如果想在Model中調用QMVCRazorPage類,哪么可以實現接口中獲取。
MVCRazorPageBase類 是關於View模板的基類
QMVCCore類 QMVC框架的核心類,控制qmvc運行的支持者。
ViewResult類 是Controller傳值給QMVCCore去調用Razor模板時的信息類,Controller把要顯示的信息給ViewResult,QMVCCore通過ViewResult加載Razor模板。
Router.IRouterProvider接口 如果你想重寫QMVC的路由功能,哪么可以實現Router.IRouterProvider接口實現。
至於APPS中的類於以上的類類似,並且實現了固定的Router。
如果你想重寫模板顯示路徑規則可以重寫ControllerBase類中的getTemplateUrl方法,這無疑對你編寫自己的框架起到了最大控制的空間,原方法代碼:
protected virtual string getTemplateUrl(string themeName,string controllerName,string viewName)
{
return "~/" + themeName + "Views/" + controllerName + "/" + viewName + ".cshtml";
}
DefaultRouter類
using System; using System.Collections.Generic; using System.Collections.Specialized; using System.Linq; using System.Reflection; using System.Text; using System.Text.RegularExpressions; using System.Web; namespace wuxiu.QMVC.Router { public class DefaultRouter : IRouterProvider { string DefaultController; string DefaultAction; RouterControllerCollection controllers = new RouterControllerCollection(); public DefaultRouter(Assembly asm, string defaultController, string defaultAction) { DefaultController = defaultController; DefaultAction = defaultAction; // controllers.LoadAssembly(asm); } public ControllerBase LoadUrl(HttpContextBase context, string apprawurl) { string controllerName = DefaultController; string action = DefaultAction; string pageurl; if (apprawurl.IndexOf('?') != -1) { pageurl = apprawurl.Substring(0, apprawurl.IndexOf('?')); } else pageurl = apprawurl; string[] urls= Utils.ClearStrArrayEmpty(pageurl.Split('/')); string[] urldata; if(urls.Length>0) { controllerName=urls[0]; }else controllerName=DefaultController; if(urls.Length>1) { action=urls[1]; if (!action.EndsWith(".action",StringComparison.OrdinalIgnoreCase)) { return null; } action = action.Substring(0,action.Length - ".action".Length); }else action=DefaultAction; if(urls.Length>2){ urldata=new string[urls.Length-2]; for(int i=2;i<urls.Length;i++) urldata[i-2]=urls[i]; }else urldata=new string[]{}; Type ControllerType = controllers.GetController(controllerName); if (ControllerType != null) { ControllerBase controller = Activator.CreateInstance(ControllerType) as ControllerBase; controller.init(context, controllerName, action, urldata); return controller; } return null; } } }
QMVC默認路由器類,沒有實現正則表達式,其實我覺得這是一個好事,因為使用字符分析更准確性能更佳。DefaultRouter類中實現了IRouterProvider接口,在LoadUrl函數中分析了http請求地址,並且通過反射的方式調用的控制器中的方法。
2、QMVC APP介紹
QMVC APP的實現目的是為了實現多個項目融合提出的解決方案,當然如果你的程序按照QMVC APP模式開發,可以很容易的實現與另一個APP之間融合到一個站點中運行。 如果你的項目按照QMVC APP模式開發,哪么Controller是繼承自wuxiu.QMVC.APPS.APPController基類,每一個應用中必須實現APPProvider類。每個應用中存放app.config文件。
QMVC APP目錄結構
APPS
APPName
DefaultViews
ControllerName
ActionName.cshtml
...
App.config
Controllers
Models
APPProvider.cs
Global.asax
Web.config
以上樹中,APPS目錄是必須目錄,用於包含當前項目中所有的應用文件夾,APPName是應用的文件夾,其中包括了Views和app.config,Views里存放了應用所用的視圖,app.config中定義了應用的配置信息。
APPProvider.cs是APPS模式中所有應用實現的一個類,他繼承於wuxiu.QMVC.APPS.APPProvider類,該類在QMVC初始化時調用,用於初始化APP。 Models和Controllers文件為當前應用的相關控制器和模型存放目錄。
QMVC APP項目配置
若建一個QMVC APP模式的項目,必須以6.2節中定義的目錄結構外,需要修改一些配置文件,讓ASP.NET運行框架支持QMVC APP運行。
Web.config中,添加或修改以下配置項:
<configuration> <system.web> <compilation debug="true" targetFramework="4.5"> <assemblies> <add assembly="System.Web.WebPages.Razor2, Version=0.0.0.0, Culture=neutral, PublicKeyToken=14679ed9c77dd5f5" /> <add assembly="System.Web.WebPages2, Version=0.0.0.0, Culture=neutral, PublicKeyToken=14679ed9c77dd5f5" /> <add assembly="System.Web.Razor2, Version=0.0.0.0, Culture=neutral, PublicKeyToken=14679ed9c77dd5f5" /> </assemblies> <buildProviders> <remove extension=".cshtml"/> <add extension=".cshtml" type="System.Web.WebPages.Razor.RazorBuildProvider, System.Web.WebPages.Razor2"/> </buildProviders> </compilation> </system.web> <system.webServer> <modules runAllManagedModulesForAllRequests="true"/> </system.webServer> </configuration>
APPS/web.config中,添加或修改以下配置項:
<configuration> <configSections> <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor2"> <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor2" requirePermission="false" /> <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor2" requirePermission="false" /> </sectionGroup> </configSections> <system.web> </system.web> <system.web.webPages.razor> <pages pageBaseType="wuxiu.QMVC.MVCRzorPageBase"> <namespaces> <add namespace="wuxiu.QMVC" /> </namespaces> </pages> </system.web.webPages.razor> </configuration>
APPS/APPName/APPProvider.config
<?xml version="1.0" encoding="utf-8" ?> <app name="貼吧系統" version="1.0" copyright="bobby" urlFolder="wuxiu" appProviderClass="wuxiu.tiebaAPP.TiebaAPPProvider" assembly="bin:wuxiu.tiebaAPP" enable="true" > <appSettings> <add key="" value=""/> ... </appSettings> <customElements> </customElements> </app>
如果您創建一個QMVC APP,哪么必須寫一個app.config描述您的應用信息,QMVC會按照您的配置去加載應用,並且把您的配置信息傳給應用。
APP節點屬性
Name 應用的名稱 Version 當前應用的版本號 appProviderClass 表示實現wuxiu.QMVC.APPS.APPProvider類的命名空間和類名,用於初始化APP的類。 assembly 當前應用的APPProvider所在的類庫,值有兩種書寫形式:
1、file冒號開頭,標識app/bin/目錄下的dll文件名,如:“file:mydll.dll”。
2、bin:默認為程序跟目錄Bin目錄下的程序集名稱,如:“bin:mydll”。
說明:推薦使用bin前綴,因為file雖然可以獨立自己的程序目錄,確存在着運行中獨占的問題,可能導致程序運行頁dll不允許移動和刪除。 Enable 標識當前程序是否可用,值有兩個:true或false。
以上章節是翻譯自吾修主頁的QMVC Doumentation章節中關於QMVC APP章節!
實現一個自己的AppController
public class HomeController:wuxiu.QMVC.APPS.APPController{ public wuxiu.QMVC.ViewResult Index(){ return View(); } }
實現一個IMVCModel類
當在模型類中可以獲取到MVCRazorPage對象無疑將Model的功能增加,他可以更靈活的提供些程序邏輯,減少了Razor模板中的代碼,畢竟Razor是給美工操作的層面代碼。
public class MyModel:wuxiu.QMVC.IQMVCModel { public string LoginPageUrl { get { return page.APPUrlStart + "/user/login.action"; } } wuxiu.QMVC.APPS.APPRazorPage page; public void Init(QMVCRzorPageBase page) { this.page = (wuxiu.QMVC.APPS.APPRazorPage)page; } }