談談.NET MVC QMVC高級開發


    自從吾修主頁上發布了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;
        }
    }

 


免責聲明!

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



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