另類的ASP.NET快速開發(fā)架構體系
第一部分 另類的MVC架構JVPL架構
1.JVPL模式(JSON+視圖+處理器+加載器)
1)定義:
JVPL和mvc設計模式類似,一個變種的MVC設計模式。
2)MVC的優(yōu)弱點:
MVC讓開發(fā)從原來的 webform中解脫出來,解決了層次清晰邏輯與UI的隔離以及服務端控件的一些瑕疵等諸多問題,但是MVC的弱點同時也存在.在MVC中我們的Model時常變動,我們必須手動創(chuàng)建Model類和Model的變動修改.同時對于 Model的Action控制操作也需要一定程度上的變動.(由實體框架等生成的實體(Model)是無法滿足現(xiàn)行邏輯需求的).
其次因為實際開發(fā)中沒有銀彈,只有平衡點.V,C之間的邏輯緊密,然而實際的前臺實現(xiàn)和效果需求是變化莫測的, 更加導致美工決定VC的局面,從而VC的重用性很低很低.如果一個頁面存在多個視圖,那么其邏輯就相對不易(我們需要維護多個VC組,我們需要處理VC組的一定邏輯次序,構造不同的Model).
3)JVPL設計模式的優(yōu)勢
1)JVPL(json-視圖-處理器--加載器),如上圖所示.如果我要視圖重用我只要載入所需視圖和加載器即可.var 新的視圖=get("加載器","視圖"); 且Moon.net架構會接著腳本引擎幫助我們生成后臺所需代碼.
2)整個JVPL模式建立建立在Ajax的機制上,它具有Ajax所有的優(yōu)缺點.(但我認為Ajax的優(yōu)點>>缺點,且我們可以通過手段解決這些缺點).正如有人說Ajax不安全,因為暴露了系統(tǒng)服務接口,這完全廢話,難道純的form提交就沒有暴露?這些都是門外漢說的話,因為根本的權限機制都沒有建立.接著說,正如前面文章提到的視圖數(shù)據(jù)的加載.如果我前臺的邏輯變動系統(tǒng)的邏輯變動,這是Moon.Web會輔助我們生產(chǎn)新的后臺代碼. 如果一個頁面存在多個視圖,那么這多個視圖的加載,我們通過加載器直接調(diào)度即可.因為腳本引擎的存在,它會幫助我們生成后臺代碼和數(shù)據(jù)分配及數(shù)據(jù)轉發(fā).Moon.NET中最為精華的部分就是腳本引擎.它也是我們提高開發(fā)效率的關鍵.
3)在我們的開發(fā)中,前端展現(xiàn)的標準是由策劃及美工定的,所以作為一個開發(fā)者還是架構師必須緊密結合實際進行架構或開發(fā).這樣才能提高開發(fā)效率. Moon.Web主要對復雜的UI控件諸如:編輯器,分頁,異步文件上傳...等控件進行了封裝且提供了美工可控制接口.因為MVC的控件方法也是一樣的.
2.JVPL設計模式的demo實例
說明:JVPL設計模式與傳統(tǒng)的ASP.NET開發(fā)完全兼容,且符合MVC的設計理念.
實例一:程序配置
-------------------------------------配置文件設置--------------------------------------
- <appSettings>
- <add key="DLL" value="Web.dll" />--------------->數(shù)據(jù)處理器和數(shù)據(jù)加載器所在的類庫名(放在Bin里面)
- <add key="dbType" value="PostgreSql" />----------->數(shù)據(jù)庫的類型
- <add key="linkString" value="Server=localhost;Database=MoonDB;User ID=postgres;Password=mingyue;" />--->連接字符串
- <add key="HTTP_ROOT_PATH" value="http://localhost:8080/Web"/>--->程序運行的根目錄
- </appSettings>
//--------------------------------------庫文件引用----------------------
//-------------------------------------加入腳本庫到根目錄
//-----------------------------------頁面開發(fā)
html結構
- <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="Web.WebForm1" %>
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title>model加載和數(shù)據(jù)更新</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" />
- </td>
- </tr>
- <tr>
- <td>
- 性別
- </td>
- <td>
- <input name="Sex" field="Sex" value="true" type="radio" />男<input name="Sex" field="Sex"
- value="false" type="radio" />女
- </td>
- </tr>
- <tr>
- <td>
- 年齡
- </td>
- <td>
- <input field="Age" type="text" />
- </td>
- </tr>
- <tr>
- <td>
- 北京戶口
- </td>
- <td>
- <input field="IsBeiJing" type="checkbox" />
- </td>
- </tr>
- <tr>
- <td>
- 年齡段
- </td>
- <td>
- <select field="AgePeriod"><option value="1">老年人</option><option value="2">中年人</option><option value="3">年輕人</option></select>
- </td>
- </tr>
- </table>
- <input type="button" onclick="AjaxUpdateUserInfo();" value="更新用戶數(shù)據(jù)" />
- </form>
- </body>
- </html>
兩處黃色部分,表示的數(shù)據(jù)的加載和數(shù)據(jù)提交。
- [Log()]//加載的代碼
- public static void GetUserInfo()
- {
- PersonSet data= DBFactory.GetEntity<PersonSet>(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的架構設計反應出的一些問題進行了全新的架構設計,彌補了多數(shù)據(jù)源使用不便、同道反應不過ORM、自身架構的瑕疵等問題。
2、介紹
Moon .ORM是一個通用數(shù)據(jù)庫處理框架(可以包含MSSQL POSTGRESQL,SQLITE EXCEL MYSQL DB2 ORACLE...只要你愿意實現(xiàn)接口就可以)。很便捷地進行常用數(shù)據(jù)庫操作(增刪改查)。其性能是幾近純ADO.NET。對于實體的查詢采用emit實現(xiàn),如果您還不滿意可用此框架的代碼生成器直接生成純ADO.NET SQL形式。其主要特色就是性能和便捷的操作。
3、特色
- 高性能(該框架采用純的ADO.NET進行框架,避免Linq以及反射帶來的性能損失);
- 易用性強(配置簡單,智能感知,代碼生成器的輔助,會sql就可(可以自我性能優(yōu)化)) ;
- 多數(shù)據(jù)庫支持(如果需要可自我擴增,熱烈歡迎同道加入團隊開發(fā)中(聯(lián)系qq:564064202));
- 強大查詢語法糖功能;
- 多數(shù)據(jù)源支持;
- .net framework 2.0原生支持。
4、配置簡單
- <appSettings>
- <add key="dbType" value="MSSQL" />
- <!--數(shù)據(jù)庫的類型 還可以寫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)
- {
- //數(shù)據(jù)添加
- PersonSet person=new PersonSet();
- person.Age=133;
- person.AgePeriod=1;
- person.IsBeiJing=true;
- person.Sex=true;
- person.UserName="秦仕川";
- DBFactory.Add(person);
- Console.WriteLine("新的數(shù)據(jù)唯一識別標志:"+person.GetOnlyMark());
- //另類數(shù)據(jù)添加
- person.Set(PersonSetTable.UserName,"另類");
- person.Set(PersonSetTable.Age,12);
- person.Set(PersonSetTable.AgePeriod,11);
- person.Set(PersonSetTable.IsBeiJing,false);
- person.Set(PersonSetTable.Sex,true);
- DBFactory.Add(person);
- Console.WriteLine("新的數(shù)據(jù)11唯一識別標志:"+person.GetOnlyMark());
- //數(shù)據(jù)刪除
- long ret= DBFactory.DeleteWhen(PersonSetTable.IsBeiJing.Equal(1).And(PersonSetTable.Age.BiggerThan(12)));
- Console.WriteLine("被刪除的條數(shù):"+ret);
- //改數(shù)據(jù)
- person.UserName="另類修改后";
- person.SetOnlyMark(PersonSetTable.UserName.Equal("另類"));
- DBFactory.Update(person);
- //查詢
- PersonSet p=DBFactory.GetEntity<PersonSet>(
- PersonSetTable.UserName.Equal("另類修改后"));
- Console.WriteLine(p.Age);
- //查詢一個字段
- int age=DBFactory.GetOneField<int>(PersonSetTable.Age, PersonSetTable.ID.Equal(5));
- Console.WriteLine(age);
- Console.Write("Press any key to continue . . . ");
- Console.ReadKey(true);
- }
- }
- }
實體代碼生成器
數(shù)據(jù)庫升級問題(我們常常面臨數(shù)據(jù)庫表的變動問題)
Moon.ORM中不必擔心這些東西,因為實體全由代碼生成器生成,更新一次數(shù)據(jù)庫,你重新生成一次DLL(代碼生成器帶有編譯功能)
原文鏈接:http://www.cnblogs.com/humble/archive/2012/02/26/2364723.html
【編輯推薦】