天天看點

.NET開發架構:另類的MVC架構和ORM系統

第一部分 另類的MVC架構JVPL架構

  (JVPL模式的系統結構圖)

  1.JVPL模式(JSON+視圖+處理器+加載器)

  1)定義:

  JVPL和mvc設計模式類似,一個變種的MVC設計模式.

  2)MVC的優弱點:

  MVC讓開發從原來的 webform中解脫出來,解決了層次清晰邏輯與UI的隔離以及服務端控件的一些瑕疵等諸多問題,但是MVC的弱點同時也存在.在MVC中我們的Model時常變動,我們必須手動建立Model類和Model的變動修改.同時對于 Model的Action控制操作也需要一定程度上的變動.(由實體架構等生成的實體(Model)是無法滿足現行邏輯需求的).

  其次因為實際開發中沒有銀彈,隻有平衡點.V,C之間的邏輯緊密,然而實際的前台實作和效果需求是變化莫測的, 更加導緻美工決定VC的局面,進而VC的重用性很低很低.如果一個頁面存在多個視圖,那麼其邏輯就相對不易(我們需要維護多個VC組,我們需要處理VC組 的一定邏輯次序,構造不同的Model).

  3)JVPL設計模式的優勢

  1)JVPL(json-視圖-處理器--加載器),如上圖所示.如果我要視圖重用我隻要載入所需視圖和加載器即可.var 新的視圖=get("加載器","視圖"); 且Moon.net架構會接着腳本引擎幫助我們生成背景所需代碼.

  2)整個JVPL模式建立建立在Ajax的機制上,它具有Ajax所有的優缺點.(但我認為Ajax的優點>>缺點,且我們可以 通過手段解決這些缺點).正如有人說Ajax不安全,因為暴露了系統服務接口,這完全廢話,難道純的form送出就沒有暴露?這些都是門外漢說的話,因為 根本的權限機制都沒有建立.接着說,正如前面文章提到的視圖資料的加載.如果我前台的邏輯變動系統的邏輯變動,這是Moon.Web會輔助我們生産新的背景代碼. 如果一個頁面存在多個視圖,那麼這多個視圖的加載,我們通過加載器直接排程即可.因為腳本引擎的存在,它會幫助我們生成背景代碼和資料配置設定及資料轉 發.Moon.NET中最為精華的部分就是腳本引擎.它也是我們提高開發效率的關鍵.

  3)在我們的開發中,前端展現的标準是由策劃及美工定的,是以作為一個開發者還是架構師必須緊密結合實際進行架構或開發.這樣才能提高開發效率. Moon.Web主要對複雜的UI控件諸如:編輯器,分頁,異步檔案上傳...等控件進行了封裝且提供了美工可控制接口.因為MVC的控件方法也是一樣 的.

  2.JVPL設計模式的demo執行個體

  說明:JVPL設計模式與傳統的ASP.NET開發完全相容,且符合MVC的設計理念.

  執行個體一:程式配置

  -------------------------------------配置檔案設定--------------------------------------

  

  --------------->資料處理器和資料加載器所在的類庫名(放在Bin裡面)

  ----------->資料庫的類型

  --->連接配接字元串

  --->程式運作的根目錄

  //--------------------------------------庫檔案引用----------------------

  引用Moon.Orm和Moon.Web庫

  //-------------------------------------加入腳本庫到根目錄

  //-----------------------------------頁面開發

  html結構

  View Code

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="Web.WebForm1" %>

    <head>

        <title>model加載和資料更新</title>

        <meta http-equiv="content-type" content="text/html; charset=utf-8" />

         <script type="text/javascript" src="Scripts/jquery-1.6.2.min.js"></script>

            <script type="text/javascript" src="Scripts/Qin.Engine.js"></script

         <script>

              var pID=-1;

             $(function () {

                 Qin_LoadDataToDom2("Web.UserInfoAction", "GetUserInfo", {}, "form_UserInfo",function(data){

                     alert(data.A);

                     pID=data.A;

                 });

             });

             function AjaxUpdateUserInfo() {

                 var ID =pID;

                    _TableName="PersonSet";

                 Qin_AjaxUpdate("Web.UserInfoAction", "AjaxUpdateUserInfo", "form_UserInfo", "ID", ID, {  }, function (data) {

                     alert("主鍵為"+data+" update success");

             }

         </script>

    </head>

    <body>

          <form id="form_UserInfo"  > 

              <input id="keyID" class="Key" field="ID" type="hidden" />      

                <table style="width: 100%;">

                <tr>

                    <td>

                        姓名:

                    </td>

                    <td> 

                        <input field="UserName" type="text" />

                </tr>

                        性别

                        <input name="Sex" field="Sex" value="true" type="radio" />男<input name="Sex" field="Sex"

                            value="false" type="radio" />女

                        年齡

                        <input field="Age" type="text" />

                 <tr>

                        北京戶口

                        <input field="IsBeiJing" type="checkbox"   />

                        年齡段

                         <select field="AgePeriod"><option value="1">老年人</option><option value="2">中年人</option><option value="3">年輕人</option></select>

    </table>

    <input type="button" value="更新使用者資料" />

    </form>

    </body>

</html>

  兩處黃色部分,表示的資料的加載和資料送出.

 [Log()]//加載的代碼

  public static void GetUserInfo()

  {

  PersonSet data= DBFactory.GetEntity(PersonSetTable.ID.Equal(1));

  CustomData cus=new CustomData();

  cus.A=1;

  ReturnJSONString(data,cus);

  }

  [Log()]//更新部分的代碼(代碼生成器會自動生成)

  public static void AjaxUpdateUserInfo()

  PersonSet data=new PersonSet();

  string UserName=Request["UserName"];

  string Sex=Request["Sex"];

  string Age=Request["Age"];

  string IsBeiJing=Request["IsBeiJing"];

  string AgePeriod=Request["AgePeriod"];

  string otherData=Request["otherData"];

  string PrimaryKey=Request["PrimaryKey"];

  data.Set(PersonSetTable.UserName,UserName);

  data.Set(PersonSetTable.Sex,Sex);

  data.Set(PersonSetTable.Age,Age);

  data.Set(PersonSetTable.IsBeiJing,IsBeiJing);

  data.Set(PersonSetTable.AgePeriod,AgePeriod);

  data.SetOnlyMark(PersonSetTable.ID.Equal(long.Parse(PrimaryKey)));

  DBFactory.Update(data);

  ReturnTextString(PrimaryKey);

   //-----------------------頁面效果及代碼生成效果

  第二部分 高效便捷的ORM架構Moon.net

  1.背景

  針對Qin.Data的架構設計反應出的一些問題進行了全新的架構設計,彌補了多資料源使用不便、同道反應不過ORM、自身架構的瑕疵等問題.

  2.介紹

  Moon .ORM是一個通用資料庫處理架構(可以包含MSSQL POSTGRESQL,SQLITE EXCEL MYSQL DB2 ORACLE...隻要你願意實作接口就可以).很便捷地進行常用資料庫操作(增删改查).其性能是幾近純ADO.NET.對于實體的查詢采用emit實 現,如果您還不滿意可用此架構的代碼生成器直接生成純ADO.NET SQL形式.其主要特色就是性能和便捷的操作.

  3.特色

  1.高性能(該架構采用純的ADO.NET進行架構,避免Linq以及反射帶來的性能損失);

  2.易用性強(配置簡單,智能感覺,代碼生成器的輔助,會sql就可(可以自我性能優化)) ;

  3.多資料庫支援(如果需要可自我擴增,熱烈歡迎同道加入團隊開發中(聯系qq:564064202))

  4.強大查詢文法糖功能

  5.多資料源支援

  6..net framework 2.0原生支援

  4.配置簡單

<appSettings> 

<add key="dbType" value="MSSQL" />

<!--資料庫的類型 還可以寫MYSQL,SQLITE,ACCESS等....—> 

<add key="linkString" value="Server=mainserver;database=HD01SystemDB;Uid=sa;Pwd=123" /> 

</appSettings>

  代碼功能示範

using System;

  using System.Collections.Generic;

  using Moon.Orm;

  using MoonDB;

  namespace r

  class Program

  public static void Main(string[] args)

  //資料添加

  PersonSet person=new PersonSet();

  person.Age=133;

  person.AgePeriod=1;

  person.IsBeiJing=true;

  person.Sex=true;

  person.UserName="秦仕川";

  DBFactory.Add(person);

  Console.WriteLine("新的資料唯一識别标志:"+person.GetOnlyMark());

  //另類資料添加

  person.Set(PersonSetTable.UserName,"另類");

  person.Set(PersonSetTable.Age,12);

  person.Set(PersonSetTable.AgePeriod,11);

  person.Set(PersonSetTable.IsBeiJing,false);

  person.Set(PersonSetTable.Sex,true);

  Console.WriteLine("新的資料11唯一識别标志:"+person.GetOnlyMark());

  //資料删除

  long ret= DBFactory.DeleteWhen(PersonSetTable.IsBeiJing.Equal(1).And(PersonSetTable.Age.BiggerThan(12)));

  Console.WriteLine("被删除的條數:"+ret);

  //改資料

  person.UserName="另類修改後";

  person.SetOnlyMark(PersonSetTable.UserName.Equal("另類"));

  DBFactory.Update(person);

  //查詢

  PersonSet p=DBFactory.GetEntity(

  PersonSetTable.UserName.Equal("另類修改後"));

  Console.WriteLine(p.Age);

  //查詢一個字段

  int age=DBFactory.GetOneField(PersonSetTable.Age, PersonSetTable.ID.Equal(5));

  Console.WriteLine(age);

  Console.Write("Press any key to continue . . . ");

  Console.ReadKey(true);

  實體代碼生成器

  資料庫更新問題(我們常常面臨資料庫表的變動問題)

  Moon.ORM中不必擔心這些東西,因為實體全由代碼生成器生成,更新一次資料庫,你重新生成一次DLL(代碼生成器帶有編譯功能)

本文轉自 wws5201985 51CTO部落格,原文連結:http://blog.51cto.com/wws5201985/790683,如需轉載請自行聯系原作者