JVPL和mvc设计模式类似一个变种的MVC设计模式下面我们将详细介绍JVPL模式以及JVPL设计模式的demo实例
第一部分 另类的MVC架构JVPL架构
(JVPL模式的系统结构图)
JVPL模式(JSON+视图+处理器+加载器)
)定义:
JVPL和mvc设计模式类似一个变种的MVC设计模式
)MVC的优弱点:
MVC让开发从原来的 webform中解脱出来解决了层次清晰逻辑与UI的隔离以及服务端控件的一些瑕疵等诸多问题但是MVC的弱点同时也存在在MVC中我们的Model时常变动我们必须手动创建Model类和Model的变动修改同时对于 Model的Action控制操作也需要一定程度上的变动(由实体框架等生成的实体(Model)是无法满足现行逻辑需求的)
其次因为实际开发中没有银弹只有平衡点VC之间的逻辑紧密然而实际的前台实现和效果需求是变化莫测的 更加导致美工决定VC的局面从而VC的重用性很低很低如果一个页面存在多个视图那么其逻辑就相对不易(我们需要维护多个VC组我们需要处理VC组的一定逻辑次序构造不同的Model)
)JVPL设计模式的优势
)JVPL(json视图处理器加载器)如上图所示如果我要视图重用我只要载入所需视图和加载器即可var 新的视图=get(加载器视图); 且架构会接着脚本引擎帮助我们生成后台所需代码
)整个JVPL模式建立建立在Ajax的机制上它具有Ajax所有的优缺点(但我认为Ajax的优点>>缺点且我们可以通过手段解决这些缺点)正如有人说Ajax不安全因为暴露了系统服务接口这完全废话难道纯的form提交就没有暴露?这些都是门外汉说的话因为根本的权限机制都没有建立接着说正如前面文章提到的视图数据的加载如果我前台的逻辑变动系统的逻辑变动这是MoonWeb会辅助我们生产新的后台代码 如果一个页面存在多个视图那么这多个视图的加载我们通过加载器直接调度即可因为脚本引擎的存在它会帮助我们生成后台代码和数据分配及数据转发MoonNET中最为精华的部分就是脚本引擎它也是我们提高开发效率的关键
)在我们的开发中前端展现的标准是由策划及美工定的所以作为一个开发者还是架构师必须紧密结合实际进行架构或开发这样才能提高开发效率 MoonWeb主要对复杂的UI控件诸如:编辑器分页异步文件上传等控件进行了封装且提供了美工可控制接口因为MVC的控件方法也是一样的
JVPL设计模式的demo实例
说明:JVPL设计模式与传统的ASPNET开发完全兼容且符合MVC的设计理念
实例一:程序配置
配置文件设置
<appSettings>
<addkey=DLLvalue=Webdll/>>数据处理器和数据加载器所在的类库名(放在Bin里面)
<addkey=dbTypevalue=PostgreSql/>>数据库的类型
<addkey=linkStringvalue=Server=localhost;Database=MoonDB;UserID=postgres;Password=mingyue;/>>连接字符串
<addkey=HTTP_ROOT_PATHvalue=//localhost:/Web/>>程序运行的根目录
</appSettings>
//库文件引用
引用MoonOrm和MoonWeb库
//加入脚本库到根目录
//页面开发
html结构
<%@PageLanguage=C#AutoEventWireup=trueCodeBehind=WebFormaspxcsInherits=WebWebForm%>
<!DOCTYPEhtmlPUBLIC//WC//DTDXHTMLTransitional//ENtransitionaldtd>
<htmlxmlns=>
<head>
<title>model加载和数据更新</title>
<metahttpequiv=contenttypecontent=text/html;charset=utf/>
<scripttype=text/javascriptsrc=Scripts/jqueryminjs></script>
<scripttype=text/javascriptsrc=Scripts/QinEnginejs></script
<script>
varpID=;
$(function(){
Qin_LoadDataToDom(WebUserInfoActionGetUserInfo{}form_UserInfofunction(data){
alert(dataA);
pID=dataA;
});
});
functionAjaxUpdateUserInfo(){
varID=pID;
_TableName=PersonSet;
Qin_AjaxUpdate(WebUserInfoActionAjaxUpdateUserInfoform_UserInfoIDID{}function(data){
alert(主键为+data+updatesuccess);
});
}
</script>
</head>
<body>
<formid=form_UserInfo>
<inputid=keyIDclass=Keyfield=IDtype=hidden/>
<tablestyle=width:%;>
<tr>
<td>
姓名:
</td>
<td>
<inputfield=UserNametype=text/>
</td>
</tr>
<tr>
<td>
性别
</td>
<td>
<inputname=Sexfield=Sexvalue=truetype=radio/>男<inputname=Sexfield=Sex
value=falsetype=radio/>女
</td>
</tr>
<tr>
<td>
年龄
</td>
<td>
<inputfield=Agetype=text/>
</td>
</tr>
<tr>
<td>
北京户口
</td>
<td>
<inputfield=IsBeiJingtype=checkbox/>
</td>
</tr>
<tr>
<td>
年龄段
</td>
<td>
<selectfield=AgePeriod><optionvalue=>老年人</option><optionvalue=>中年人</option><optionvalue=>年轻人</option></select>
</td>
</tr>
</table>
<inputtype=buttononclick=AjaxUpdateUserInfo();value=更新用户数据/>
</form>
</body>
</html>
两处黄色部分表示的数据的加载和数据提交
[Log()]//加载的代码
publicstaticvoidGetUserInfo()
{
PersonSetdata=DBFactoryGetEntity<PersonSet>(PersonSetTableIDEqual());
CustomDatacus=newCustomData();
cusA=;
ReturnJSONString(datacus);
}
[Log()]//更新部分的代码(代码生成器会自动生成)
publicstaticvoidAjaxUpdateUserInfo()
{
PersonSetdata=newPersonSet();
stringUserName=Request[UserName];
stringSex=Request[Sex];
stringAge=Request[Age];
stringIsBeiJing=Request[IsBeiJing];
stringAgePeriod=Request[AgePeriod];
stringotherData=Request[otherData];
stringPrimaryKey=Request[PrimaryKey];
dataSet(PersonSetTableUserNameUserName);
dataSet(PersonSetTableSexSex);
dataSet(PersonSetTableAgeAge);
dataSet(PersonSetTableIsBeiJingIsBeiJing);
dataSet(PersonSetTableAgePeriodAgePeriod);
dataSetOnlyMark(PersonSetTableIDEqual(longParse(PrimaryKey)));
DBFactoryUpdate(data);
ReturnTextString(PrimaryKey);
}
//页面效果及代码生成效果
第二部分 高效便捷的ORM架构
背景
针对QinData的架构设计反应出的一些问题进行了全新的架构设计弥补了多数据源使用不便同道反应不过ORM自身架构的瑕疵等问题
介绍
Moon ORM是一个通用数据库处理框架(可以包含MSSQL POSTGRESQLSQLITE EXCEL MYSQL DB ORACLE只要你愿意实现接口就可以)很便捷地进行常用数据库操作(增删改查)其性能是几近纯ADONET对于实体的查询采用emit实现如果您还不满意可用此框架的代码生成器直接生成纯ADONET SQL形式其主要特色就是性能和便捷的操作
特色
高性能(该框架采用纯的ADONET进行框架避免Linq以及反射带来的性能损失)
易用性强(配置简单智能感知代码生成器的辅助会sql就可(可以自我性能优化))
多数据库支持(如果需要可自我扩增热烈欢迎同道加入团队开发中(联系qq:))
强大查询语法糖功能
多数据源支持 < framework 2.0原生支持。tw.wingWit.CoM
4、配置简单
<appSettings>
<addkey="dbType"value="MSSQL"/>
<!--数据库的类型还可以写MYSQL,SQLITE,ACCESS等....—>
<addkey="linkString"value="Server=mainserver;database=HD01SystemDB;Uid=sa;Pwd=123"/>
</appSettings>
代码功能演示
usingSystem;
usingSystem.Collections.Generic;
usingMoon.Orm;
usingMoonDB;
namespacer
{
classProgram
{
publicstaticvoidMain(string[]args)
{
//数据添加
PersonSetperson=newPersonSet();
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());
//数据删除
longret=DBFactory.DeleteWhen(PersonSetTable.IsBeiJing.Equal(1).And(PersonSetTable.Age.BiggerThan(12)));
Console.WriteLine("被删除的条数:"+ret);
//改数据
person.UserName="另类修改后";
person.SetOnlyMark(PersonSetTable.UserName.Equal("另类"));
DBFactory.Update(person);
//查询
PersonSetp=DBFactory.GetEntity<PersonSet>(
PersonSetTable.UserName.Equal("另类修改后"));
Console.WriteLine(p.Age);
//查询一个字段
intage=DBFactory.GetOneField<int>(PersonSetTable.Age,PersonSetTable.ID.Equal(5));
Console.WriteLine(age);
Console.Write("Pressanykeytocontinue...");
Console.ReadKey(true);
}
}
}
实体代码生成器
数据库升级问题(我们常常面临数据库表的变动问题)
Moon.ORM中不必担心这些东西,因为实体全由代码生成器生成,更新一次数据库,你重新生成一次DLL(代码生成器带有编译功能)