淺談QMVC APP開發

來源:互聯網
上載者:User

標籤:qmvc   mvc   .net   



  自從吾修首頁上發布了QMVC源碼,非常感興趣,用了半月的時間學習,真的感覺收益非淺,在此聲明非常感謝吾修大哥的分享!
    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預設路由器類,沒有實現Regex,其實我覺得這是一個好事,因為使用字元分析更準確效能更佳。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;        }    }


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.