第一部分 另类的MVC架构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的设计理念.
实例一:程序配置
-------------------------------------配置文件设置--------------------------------------
- <appSettings>
- <add key="DLL" value="Web.dll" />--------------->数据处理器和数据加载器所在的类库名(放在Bin里面)
- <add key="dbType" value="PostgreSql" />----------->数据库的类型
- <add key="linkString" value="Server=localhost;Database=MoonDB;User ID=postgres;Password=mingyue;" />--->连接字符串
- <add key="HTTP_ROOT_PATH" value="http://localhost:8080/Web"/>--->程序运行的根目录
- </appSettings>
//--------------------------------------库文件引用----------------------
//-------------------------------------加入脚本库到根目录
//-----------------------------------页面开发
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加载和数据更新</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="更新用户数据" />
- </form>
- </body>
- </html>
两处黄色部分,表示的数据的加载和数据提交。
- [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的架构设计反应出的一些问题进行了全新的架构设计,弥补了多数据源使用不便、同道反应不过ORM、自身架构的瑕疵等问题。
2、介绍
Moon .ORM是一个通用数据库处理框架(可以包含MSSQL POSTGRESQL,SQLITE EXCEL MYSQL DB2 ORACLE...只要你愿意实现接口就可以)。很便捷地进行常用数据库操作(增删改查)。其性能是几近纯ADO.NET。对于实体的查询采用emit实现,如果您还不满意可用此框架的代码生成器直接生成纯ADO.NET SQL形式。其主要特色就是性能和便捷的操作。
3、特色
- 高性能(该框架采用纯的ADO.NET进行框架,避免Linq以及反射带来的性能损失);
- 易用性强(配置简单,智能感知,代码生成器的辅助,会sql就可(可以自我性能优化)) ;
- 多数据库支持(如果需要可自我扩增,热烈欢迎同道加入团队开发中(联系qq:564064202));
- 强大查询语法糖功能;
- 多数据源支持;
- .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);
- DBFactory.Add(person);
- 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<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);
- }
- }
- }
实体代码生成器
数据库升级问题(我们常常面临数据库表的变动问题)
Moon.ORM中不必担心这些东西,因为实体全由代码生成器生成,更新一次数据库,你重新生成一次DLL(代码生成器带有编译功能)
原文链接:http://www.cnblogs.com/humble/archive/2012/02/26/2364723.html
【编辑推荐】