问题描述
我有着五六年的软件开发经验。曾经在专业软件公司和集团公司从事软件开发与维护工作。自2008年5月开始在群英负责网络硬盘项目。我们团队由我和两个刚毕业的本科生,一个负责javascript,一个负责Asp.Net编程。面对这样一个开发经验相对缺少的开发团队,如何使团队每个成员都能够快速上手,可以完成自己的工作任务。于是我在参照了微软的MVC开源架构和结合自己多年的开发经验的基础上,再加上软件有关开发理论,与团队成员自行编写了我们开发体系。这套开发体系,我们充分地应用面向对象理论。用事实证明了面向对象开发的好处。现在我们团队开发完成javascript、数据库操作、.net开发框架,给我们的开发和维护工作带来了极大的方便,节约不少代码量。框架图[/B][/B][img=http://b9.photo.store.qq.com/http_imgload.cgi?/rurl4_b=b60aa678d990ccd98c56251ac937053a2e52e8cbc37041ef89df2a74f8d4a1859074c3ffc9ceeef9fa7c5b4f4494449ffcf1e271990cb40d61f29b3d662919c34b0d70983ff91fae895bf47f3dad0c806c7fa069][/img]一、[/B]javascript[/B]部分。[/B][/B]1、javascript组织方式改进。以前的javascript方法都是简单的一个方法名。方法写在页面或一个脚本文件中!这样做的问题就是大量的方法都是杂乱无章,以后在维护和调用的时候,查找起来非常麻烦。现在应用面向对象的开发理论,将javascript脚本按用途、功能模块以命名空间的形式来组织起来,这样通过查看引用前缀可以快速定位javascript方法的位置,容易扩展功能。如QY.Ajax.SendData。这样调用的时候一目了然。2、多浏览器支持作为b/s项目,我们开发出来的页面,还必须考虑是否支持众多的浏览器IE,Firefox等各个版本。我们javascript框架每个方法都是通过测试。保证了各个浏览器的浏览效果。3、方便、功能强大Ajax的请求类。我们后台的每个方法都是一个独立的编号,前端通过编号,加上请求参数便可以请求后台的方法,执行相关的操作或返回页面输出内容。4、方便、功能强大的XML操作类。XML操作类支持各类浏览器,支持众多的XML操作类型。5、功能强大的弹式框。IE、FireFox浏览器自带的对话框,界面粗造,更不好的是,FireFox浏览器无法通过脚本弹出新窗口。针对这些问题,我们开发一个功能强大的对话框javascript.。它可以1、提示框2、输入框3、在对话框中打开一个网页4、指定对话框的关闭事件5、指定对话的OK/Cancel按钮事件。6、指定标题二、[/B]数据库操作类[/B][/B]对于应用类型的程序,核心部分还是数据的操作部分。针对以前大家都把数据库脚本直接放在代码中,这样做的结果,就要修改就必须直接修改代码。那我们现在的数据操作语句是保存在一个数据库语句XML配置文件中。这样程序开发人员只需要通过语句编号就可以调用语句。要修改语句的时候,直接修改配置文件,而不必修改代码和编译程序。丰富的数据操作类。各种常见的数据操作,分页,数据与模型的转换。特点:1、通过方法中的参数传入模型变量,代码自动去匹配命令中的相应参数,相应的参数值从模型变量中的相应属性赋值。2、方法执行查询后,根据传入的需要返回的模型类型,自动将查询结果中的字段填充到模型中,然后一个相应模型类型的结果或结果集。1、执行一条语句2、执行一条语句返回一个值3、执行一条语句返回一个数据表4、执行一条语句返回一个泛型列表5、执行一条语句返回一个值6、执行一条语句返回一个分页的据数表(数据库端、代码端处理分页)7、执行一条语句返回一个分页的泛型列表(数据库端、代码端处理分页)开发人员只需要传入语句的编号,调入相应的方法,即可执行语句和获得执行结果关于数据库操作的接口。IDictionaryCmdParameters{get;set;}stringConfigXmlFile{get;set;}stringConnectionString{get;set;}boolneedTransaction{get;set;}boolExecQuery(stringCmdText);boolExecQueryBySqlId(stringSqlId);objectExecScalar(stringCmdText);objectExecScalarBySqlId(stringSqlId);IList<T>GetData<T>(stringcmdText);DataTableGetData(stringSelectCommand);IList<T>GetDataBySqlId<T>(stringSqlId);DataTableGetDataBySqlId(stringSqlId);TGetModel<T>(stringcmdText);TGetModelBySqlId<T>(stringSqlId);IList<T>GetPage<T>(stringcmdText,refPageObjPageObj)DataTableGetPage(stringSelectCommand,refPageObjPageObj)DataTableGetPageBySqlId(stringSqlId,refPageObjPageObj)IList<T>GetPageBySqlId<T>(stringSqlId,refPageObjPageObj)DataTableGetPageServer(stringcmdText,refPageObjPageObj)IList<T>GetPageServer<T>(stringcmdText,refPageObjPageObj)IList<T>GetPageServerBySqlId<T>(stringSqlId,refPageObjPageObj)DataTableGetPageServerBySqlId(stringSqlId,refPageObjPageObj)[/B]三、[/B]接口层与业务层、控件层、表现层的实现与通信。[/B][/B]每个模块定义一个接口,负责业务层的程序员根据接口功能实现接口,然后控件层的程序员用参数传递给业务层控制器,装载指定的业务模块,创建接口的实例。执行与数据库层的相关操作。控件层承接业务和表现层交互的地方,控件层不仅把页面上的输入和请求,经过业务逻辑处理提交业务层保存至数据库。还是负责把业务层返回来结果,传递给前端用户。控件层上在的每个方法都可以看成是一个组件,他们不仅可以自由的组合的起来,根据实际的应用需要由页面或Ajax重复调用。Ajax调用统一通过IHttpHandler接口类,传入一个方法编号和相应的方法编号,即可以执行相应的控件方法。表现层与控件层的通信实现。表现层上的程序层通过调用控件层控制器,直接创建一个控件层对象,指定调用的方法。表现层通过反射原理,执行指定控件层上的方法。完整的示例代码如下控件层publicclassDisk:QY.Comm.Controller{通过创建一个业务接口的实例publicJia.JiaInterface.Disk.IDiskMyDisk=Jia.BllFactory.Activator.Func<Jia.JiaInterface.Disk.IDisk>(Jia.BllFactory.JiaGetClassConst.Jia_Bll_Disk_Disk);publicMember.LoginLogin=newJia.ControlerHome.Member.Login();///<summary>///输出专辑的XML///</summary>[ParamerterMap("SpecialUserXML","001")]publicvoidSpecialUserXML(intMemberId){stringXML=DataTools.DataTableToXML(SpecialUserGet(MemberId));BaseClass.ResponseXML(XML);}publicDataTableSpecialUserGet(intMemerId){returnMyDisk.FileSpecialAllSubGetTable("1",MemerId);}}表现层的页面调用方法CallMethodSet("MemberLevelAppGetPage,GetAll");--指定控件的执行方法列表QY.Comm.IControllercontroller=Jia.ControllerFactory.Activator.Func<Jia.ControlerHome.Admin.Admim_P2>(Jia.ControllerFactory.Admin.ClassConst.Jia_ControlerHome_Admin_Admim_P2);Execute(controller);BindControl(this.dgLevelApp,ViewData["rptAppList"]);Ajax调用方法functionMemberDelete(Id,MemberName){if(confirm('你确定要删除所选的会员吗?删除后该会员所有的内容都无法恢复!')){varpostData=[];postData.push(["MemberId",Id]);postData.push(["MemberName",MemberName]);postData.push(["AjaxMethod","010002"]);SendAjaxDataX(null,"GetService.axd","正在提交服务器处理",postData,"",function(xhr){CheckLogin(xhr.getResponseHeader("login"));if(PageNum==0)PageNum=1;getDataPage(PageNum,0);},false)}}加载页面内容functiongetDataPage(page){varKeyWord1=$("SearchText").value;/*varKeyWord2=$("SearchLeaveler").value;varKeyWord3=$("SearchIP").value;varKeyWord4=$("HurryLevel").value;varKeyWord5=$("LeaveType").value;varKeyWord6=$("Checked").value;*/BeginDate=$("txtMoreBeginDate").value;EndDate=$("txtMoreEndDate").value;varfunc=function(xhr){CheckLogin(xhr.getResponseHeader("login"));if($("SearchText").value!=""||(BeginDate!=""&&EndDate!="")){$("searchResult").className="ShowsearchText";varDateShow="";if(BeginDate!=""&&EndDate!="")DateShow="("+BeginDate+"至"+EndDate+")";$("searchResult").innerHTML="搜索""+KeyWord1+DateShow+""的结果有"+LeaveList_JsPager.TotalRecoard+"条记录:";}else$("searchResult").className="HidesearchText";$("content").innerHTML=xhr.responseText;varsHTML="<center>"+LeaveList_JsPager.Create(page,"getDataPage($Page$);",1)+"</center>";$("ListpagerDown").innerHTML=sHTML;if(LeaveList_JsPager.TotalRecoard==0)$("content").innerHTML="<centerstyle='margin:50px50px50px50px;font-size:large;color:Gray'>当前没有用户留言</center>";};LeaveList_JsPager.CurrentPage=page;LeaveList_GetPage(null,"AjaxHTML.axd",func,"GetAjaxHtml=/Admin/Control/LeaveWordManage.ascx&Search="+KeyWord1+"&BeginDate="+BeginDate+"&EndDate="+EndDate,"正在载入,请稍候...","");
解决方案
解决方案二:
不错,学习了,对于以后很有用处