1. 程式人生 > >為Linux重新開發MVC,有圖有真相

為Linux重新開發MVC,有圖有真相

1.寫在前面

      就連我們自己開始時也在問自己:我們為什麼要開發一套MVC,微軟的難道不可用用嗎?

一開始的理由很簡單.為了更好地跨平臺部署;在Linux部署過.NET的人們應該知道,

部署起來是有點繁瑣的.自己試試就知道了:

檔名問題、版本問題、相容問題................

但當我們仔細思考後發現了有些東西勢在必行.

2.我們的原因

1)我們需要更好的跨平臺框架

      正如概述裡提到的,微軟的MVC不能夠直接提供支援..從開發的角度來看你的開發環境需要重新配置一番,你的伺服器執行環境同樣需要

繁瑣的配置.而我們需要的效果很直接:一套程式碼無論是在IDE中還是在IIS或Linux Web伺服器上都能無縫執行.

簡單來講,程式碼搬過去搬過來都能很好除錯、執行、無需繁瑣的配置.

      而微軟的MVC始終在為其Windows Server考慮.

2)我們需要更優秀的MVC程式設計理念及測試環境.

我們先看一段MVC的程式碼

public ActionResult GetStudent(int id)
 {
            Student st = new Student();
            st.Email = "[email protected]";
            st.Name = "秦時明月" + DateTime.Now.ToShortDateString();
            st.Password 
= "pwd"; st.PID = 23; st.Birth = DateTime.Now.AddYears(-10); st.Fa = new Father(); st.Fa.Age = 90; st.Fa.Name = "Father1"; st.Fa.Mother = new Mother() { Name = "mm", Age = 1002 }; return View(st); }

現在我們提出兩個疑問:

1. 如果上面的業務功能我需要在其他程式碼中使用怎麼辦?比如:我有一個查詢功能就是這樣的模式.----程式碼重用率

2.如果我要對這段程式碼進行自動化測試怎麼辦?或許你有好方法----但這是一個問題.

假如,MVC的Action 為以下程式碼,那麼所有的問題就不是問題了.

public Student GetStudent(int id)
        {
            Student st = new Student();
            st.Email = "[email protected]";
            st.Name = "秦時明月<>" + DateTime.Now.ToShortDateString();
            st.Password = "pwd";
            st.PID = 23;
            st.Birth = DateTime.Now.AddYears(-10);
            st.Fa = new Father();
            st.Fa.Age = 90;
            st.Fa.Name = "Father1";
            st.Fa.Mother = new Mother() { Name = "mm", Age = 1002 };
            return st;
        }

以上僅僅是一個引子.還有很多其他類似問題,我們以後再討論.

3)我們要更好的Debug環境

當然你說你可以把微軟的MVC原始碼拿進來做除錯,

但我也可以問你:你在一刻鐘之內能夠將其整合到你的專案中進行除錯嗎?

3.專案截圖

            <%=Html.TextBoxFor(m => m.Name) %><br />
            <%=Html.TextBoxFor(m => m.Password) %><br />
            <%=Html.TextBoxFor(m => m.PID) %><br />
            <%=Html.TextBoxFor(m => m.Birth) %><br />
            <%=Html.TextBoxFor(m => m.Fa.Name) %><br />
            <%=Html.TextBoxFor(m => m.Fa.Mother.Name) %><br />
            <%=Html.TextBoxFor(m => m.Fa.Mother.Age) %><br />

4.配置過程.

從dll包裡面引用

1.引用Moon.Web,(Moon.Orm,FluentValidation 可以不引用)

2.配置web.config的page節點.

<pages pageParserFilterType="Moon.Web.ViewTypeParserFilter, Moon.Web" 
              pageBaseType="Moon.Web.MViewPage,Moon.Web"  enableViewState="false" enableViewStateMac="false"
                 autoEventWireup="false"
           >
        <namespaces>
          <add namespace="Moon.Web" />
        </namespaces>
      </pages>
View Code

3.配置handler

1)若整合模式.(現在WINDOWS SERVER基本上都用整合模式) configuration節點下直接使用如下配置

<system.webServer>
    <handlers>
      <add name="RequestHandler" path="*.htm" verb="*" type="Moon.Web.RequestHandler, Moon.Web" />
    </handlers>
  </system.webServer>

2)若經典模式(老版本IIS,包括xsp4 mono)

<configuration>
     <system.web> 下配置.

   <httpHandlers>
    <add   path="*.htm" verb="*" type="Moon.Web.RequestHandler, Moon.Web" />
    </httpHandlers>

4.新增資料夾

在專案根目錄下新增

Controllers資料夾(非必須)

Views資料夾

如上面專案結構圖所示.

5.建立Controller

如下所示,繼承BaseController即可.

然後在global檔案中註冊路由

6.建立檢視