《MVCWebAPI3层分布式框架开发》由会员分享,可在线阅读,更多相关《MVCWebAPI3层分布式框架开发(38页珍藏版)》请在金锄头文库上搜索。
1、MVCWebAPI3层分布式框架开发系统分层体系架构设计数据存储层数据访问层服务层Web展现层浏览器数据访问:Dapper-微型ORMapping框架Dapper的优势:1,Dapper是一个轻型的ORM类。代码就一个SqlMapper.cs文件,编译后就40K的一个很小的Dll.2,Dapper很快。Dapper的速度接近与IDataReader,取列表的数据超过了DataTable。3,Dapper支持Mysql,SqlLite,Mssql,Oracle等一系列的数据库,当然如果你知道原理也可以让它支持Mongodb4,Dapper的r支持多表并联的对象。支持一对多多对多的关系。并且没侵入
2、性,想用就用,不想用就不用。无XML无属性。代码以前怎么写现在还怎么写。Dapper原理及特性5,Dapper原理通过Emit反射IDataReader的序列队列,来快速的得到和产生对象。性能实在高。6,Dapper是C#实现,支持.netframework各种版本;7,Dapper语法十分简单。并且无须迁就数据库的设计。国外大型网站采用的有:StackOverflow,StackExcahnge等。数据访问:Dapper-微型ORMapping框架读取500条记录,并做简单对象的序列化操作时间对比如下图:DataRepository类实现数据实体操作封装Insert插入Update更新Del
3、ete删除Select选取Paged分页ServiceBase类实现业务实体对象的操作封装Insert插入Update更新Delete删除Select选取Paged分页服务实现类实现Iservice接口继承ServiceBase基类WebAPI服务发布APIController:-HttpGet-HttpPost-HttpPut-HttpDelete动态加载插件系统的扩展性系统的变化性客户二次开发MEF运行时加载AutoMapper实体对象之间转换两个实体类EPProduct数据实体Product业务实体转化示例代码EPProduct p = ProductRepository.Get(lon
4、g.Parse(id);();Product entity = (p)面向接口编程-Ioc框架SimpleInjector静态类型编译阶段MEF动态类型运行时阶段Jquery插件DataGridSlickGrid第三方开源TreeJstree第三方开源TabcuteTab自己封装ToolbarcuteToolbar自己封装DialogFancyBox第三方开源主界面示意图Asp.NETMVC富客户端开发ModelWebAPI(服务接口)Controller路由View页面富客户端Ajax局部刷新鼠标、键盘响应事件等如Gmail邮箱等应用示例Jquery(1)jQuery项目是由JohnResi
5、g在2005年创建的,最初的想法是实现跨浏览器的DOM遍历和操纵。目前的中包含了越来越多的工具以简化JavaScript的开发工作。根据BuiltWith的使用统计,开源项目jQuery在世界前10,000名站点中的使用率超过了30%。jQueryAPI的设计初衷就是简单与直观,可以实现如下功能:遍历DOM操纵DOM元素处理CSS处理事件Ajax交互辅助功能一个UI库一个效果库jQuery框架使用了简单的选择器来获取并操纵DOM元素。一旦获得DOM中的某个元素,它就成为一个jQuery对象,可以使用库中的任何方法来操纵该对象。jQuery框架还支持使用复杂的选择器,比如基于父子关系、属性和过滤
6、器的元素等。Jquery(2)Traversing(或是在DOM元素中导航)API包含的方法可以过滤已选择的元素集合,如filter()、is()、not()和slice()等。还有一些TraversingAPI可以根据元素之间的关系(这一点不同于使用id或class选择器)找到特定的元素,比如children()、find()、contents()、next()、prev()、parents()和siblings()等,这些方法能够极大简化元素的查找操作。一旦选择了DOM元素(要么选择,要么创建),接下来就可以使用jQuery来操纵这些元素了,这些操作有:向文档中插入元素设定innerHTM
7、L或Text、在其他元素的首或尾、前或后以及周围插入内容替换匹配的元素移除元素克隆元素CSS组件提供了一套工具来获取和设定任何元素或元素集合的CSS属性。该类别中的工具还有width()和height()方法以及用于获取任意指定元素相对偏移量的offset()方法。jQuery框架为事件处理提供了跨浏览器的实现,提供了定义与触发客户化事件的方法,还可以绑定到标准的DOM事件上。它还提供了大量的事件辅助方法,可以用jQuery函数包装标准的DOM元素,开发者可以通过这些函数用最少的代码响应特定元素的事件,如click等,而且无需检测浏览器。jQueryAjaxAPI所包含的方法可以通过get或p
8、ost请求加载远程页面、数据和脚本,可以轻松访问JSON数据,此外还有一套客户化的AJAX事件来处理success、complete、start、stop和error事件。前端页面Ajax调用:GET/POST/PUT/DELETEfunctiononDelete()varjsonOrder=JSON.stringify(deletedData);$.ajax(url:ProductSys.WebAPI/api/OrderView,type:DELETE,data:jsonOrder,success:function(data)alert(data););functiononSave()var
9、jsonOrder=JSON.stringify(changedData);$.ajax(url:ProductSys.WebAPI/api/OrderView,type:PUT,data:jsonOrder,success:function(data)alert(data););如何调试(1)?Fiddler-*5star如何调试(2)FireBugforFirefox查看HTML,CSS,Javascript等监控下载图片资源时间线完善友好的调试如何调试(3)?Firefox的RestClient插件RestClient测试插件http:/localhost:8081/ProductSys
10、.WebAPI/api/order/insertwith?type=insertwith“HttpPostpublicHttpResponseMessageInsertWith(Orderentity,stringtype)Delete利用RestClienthttp:/localhost:8081/ProductSys.WebAPI/api/order/4HttpDeletepublicHttpResponseMessageDelete(stringid)Web异常错误代码100-199Informational200-299Clientrequestsuccessful300-399Cli
11、entrequestredirected,furtheractionnecessary400-499Clientrequestincomplete500-599ServererrorJavascriptNamespace(命名空间)默认为全局范围,有潜在类型冲突隐患SelfExecutingFuction(自执行匿名函数)ObjectandArray(对象和数组初始化)不要使用new关键字NullOrEmpty(检查NULL)Javascript-自执行匿名函数(1)/Self-ExecutingAnonymousFunc:Part2(Public&Private)(function(skil
12、let,$,undefined)/PrivatePropertyvarisHot=true;/PublicPropertyskillet.ingredient=BaconStrips;/PublicMethodskillet.fry=function()varoliveOil;addItem(tnButternt);addItem(oliveOil);console.log(Frying+skillet.ingredient);/PrivateMethodfunctionaddItem(item)if(item!=undefined)console.log(Adding+$.trim(item
13、);(window.skillet=window.skillet|,jQuery);Javascript-自执行匿名函数(2)外部调用方式示例/PublicPropertiesconsole.log(skillet.ingredient);/BaconStrips/PublicMethodsskillet.fry();/AddingButter&FrayingBaconStrips/AddingaPublicPropertyskillet.quantity=12;console.log(skillet.quantity);/12/AddingNewFunctionalitytotheSkill
14、et(function(skillet,$,undefined)/PrivatePropertyvaramountOfGrease=1Cup;/PublicMethodskillet.toString=function()console.log(skillet.quantity+skillet.ingredient+&+amountOfGrease+ofGrease);console.log(isHot?Hot:Cold);(window.skillet=window.skillet|,jQuery);try/12BaconStrips&1CupofGreaseskillet.toString
15、();/ThrowsExceptioncatch(e)console.log(e.message);/isHotisnotdefined对象和数组初始化/建议申明对象或数组的写法varperson=,keys=;/申明复杂对象或数组的写法varperson=firstName:Elijah,lastName:Manor,sayFullName:function()console.log(this.firstName+this.lastName);,keys=123,676,242,4e3;判断对象是否为NULL(c#)/C#例子.不要在Javascript中这样写if(someString!=
16、null&someString.length0)/Dosomethinghere./C#例子检查字符串是否为空if(!string.IsNullOrEmpty(someString)/Dosomethinghere.判断对象是否为NULL(javascript)Javascript中的正确写法/SimplifiedJavaScriptsyntaxtocheckfor/undefined,null,&emptystringvaluesif(someString)/Dosomethinghere.设置缺省值(c#)/C#例子,不要在Javascript这样写if(someString=null)s
17、omeString=defaultValue;/Slightlybetter,butdontdothiseithersomeString=someString?someString:defaultvalue;设置缺省值(javascript)请在Javascript按如下格式写/JavaScriptsyntaxtosetadefaultvaluesomeString=someString|defaultvalue;不同类型的比较操作符(=,!=)/UnexpectedComparisonsusingthe=Operator0=/true0=0/truefalse=0/truenull=unde
18、fined/truetrn=0/true不同类型的比较操作符(=,!=)/ExpectedComparisonsusingthe=Operator0=/false0=0/falsefalse=0/falsenull=undefined/falsetrn=0/false不可取的数组遍历操作符forinvarmyArray=,name;myArray5=test;console.log(myArray.length);/6for(nameinmyArray)console.log(name,myArrayname);/Outputs./5,test正确的数组遍历操作符for;varmyArray=
19、,name;myArray5=test;console.log(myArray.length);/6for(vari=0,length=myArray.length;ilength;i+)console.log(i,myArrayi);/Outputs./0,undefined/1,undefined/2,undefined/3,undefined/4,undefined/5,test对象遍历操作符for(varnameinobject)/Yourcodehere/*Checkifobjecthaspropertybeforeiterating,becausefunctionsinheritedfromprototypearealsoincluded*/for(varnameinobject)if(object.hasOwnProperty(name)/YourcodehereNuGet快捷获取软件包充分利用开源软件包,避免重复制造轮子;也可以自己发布软件包,回馈社区,先进技术的积累可以节约项目成本。学习要点及资源:AMVCWebAPIRestfulWebService的发展Jquery官网插件开发RequrieJSJavascript模块化开发框架Dapper微型ORMapping框架EntityFrameworkMicrosoft实体框架