【ASP.NET开发】ASP.NET(MVC)三层架构知识的学习总结
至从使用过一次MVC进行团队开发后,体会到了面向对象开发软件的便利。使用MVC的时候,各个层之间的低耦合使得他们之间的联系非常的第,也就降低了模块之间的依赖程度。 首先介绍一下MVC的意义,和各个层面之间的用途和功能。 1)实体层。主要用来声明在视图层和业务逻辑层之间传递数据的载体。通常代表来源与项目数据库中一个或者多个表组成的一条有意义的记录。 2)业务逻辑层。根据业务逻辑向视图层提供数据,这个项目中的类有权根据业务逻辑来决定是否调用数据库访问层的方法 3)数据库访问层。项业务逻辑层提供访问数据的方法。 4)视图层。主要是以网站开发为例。用于提供显示,添加,编辑和删除数据。 我在VS中创建的项目的结构图: NetMVC就是所谓的视图层。Entity是实体层,用来声明开发过程中被要使用的所有变量。DAL是数据库访问层,主要完成所有操作对数据库的访问。BLL是业务逻辑层,处理视图层传来的业务逻辑,然后传递给数据库访问层进行处理。 本例主要演示的是登陆页面的实现,Entity层的代码如下 usingSystem; usingSystem.Collections.Generic; usingSystem.Text; namespaceEntity { publicclassUserInfo { privateintUserId; ///<summary> ///用户比编号 ///</summary> publicintUserId1 { get{returnUserId;} set{UserId=value;} } privatestringusername; ///<summary> ///登录账户名称 ///</summary> publicstringUsername { get{returnusername;} set{username=value;} } privatestringpassword; ///<summary> ///登录密码 ///</summary> publicstringPassword { get{returnpassword;} set{password=value;} } privateintloginCount; ///<summary> ///登陆次数 ///</summary> publicintLoginCount { get{returnloginCount;} set{loginCount=value;} } privateDateTimeregDate; ///<summary> ///注册时间 ///</summary> publicDateTimeRegDate { get{returnregDate;} set{regDate=value;} } privateDateTimelastLoginDate; ///<summary> ///最后登录时间 ///</summary> publicDateTimeLastLoginDate { get{returnlastLoginDate;} set{lastLoginDate=value;} } privateboolisForbidden; privatestringpasswordQuestion; ///<summary> ///找回密码提示问题 ///</summary> publicstringPasswordQuestion { get{returnpasswordQuestion;} set{passwordQuestion=value;} } privatestringpasswordAnswer; ///<summary> ///找回密码答案 ///</summary> publicstringPasswordAnswer { get{returnpasswordAnswer;} set{passwordAnswer=value;} } } } 完成对实体类的创建,接着就要完成对数据库访问层的创建(其中需要用到上篇问章所写的SqlHelper数据库访问通用类http://yisuowushinian.blog.51cto.com/4241271/999324),代码如下, usingSystem; usingSystem.Collections.Generic; usingSystem.Text; usingSystem.Data; usingSystem.Data.SqlClient; usingSystem.Configuration; usingEntity; namespaceDAL { publicclassUserDal { privatestringconnectionString=ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString; ///<summary> ///添加用户 ///</summary> ///<paramname="info">用户的实体类</param> ///<returns></returns> publicboolAddUser(UserInfoinfo) { stringsql="insertintoUsers(Username,password)values('@Username','@password')"; SqlParameter[]parameters=newSqlParameter[4]; parameters[0]=newSqlParameter("@Username",SqlDbType.NVarChar,30); parameters[0].Value=info.Username; parameters[1]=newSqlParameter("password",SqlDbType.VarChar,50); parameters[1].Value=info.Password; returnnewSqlDbHelper(connectionString).ExecuteNonQuery(sql)>0; } ///<summary> ///删除用户 ///</summary> ///<paramname="UserId">用户编号</param> ///<returns></returns> publicboolDeleteUser(intUserId) { stringsql="deletefromuserswhereUserId="+UserId; returnnewSqlDbHelper(connectionString).ExecuteNonQuery(sql)>0; } ///<summary> ///更新用户 ///</summary> ///<paramname="info">用户的实体类</param> ///<returns></returns> publicboolUpDateUser(UserInfoinfo) { stringsql="updateuserssetpassword=@password,loginCount=@loginCountwhereuserid=@userid"; SqlParameter[]parameters=newSqlParameter[7]; parameters[0]=newSqlParameter("@password",SqlDbType.VarChar,30); parameters[0].Value=info.Password; parameters[1]=newSqlParameter("@loginCount",SqlDbType.Int,4); parameters[1].Value=info.LoginCount; returnnewSqlDbHelper(connectionString).ExecuteNonQuery(sql)>0; } ///<summary> ///根据用户名或者用户编号查询用户 ///</summary> ///<paramname="userId">用户编号</param> ///<returns></returns> publicDataTableGetUser(intuserId) { stringsql="select*fromuserswhereuserId=@UserId"; SqlParameter[]parameters=newSqlParameter[1]; parameters[0]=newSqlParameter("@UserId",SqlDbType.Int,4); parameters[0].Value=userId; returnnewSqlDbHelper(connectionString).ExecuteDataTable(sql,CommandType.Text,parameters); } ///<summary> ///根据用户名查询用户信息 ///</summary> ///<paramname="Username">用户名</param> ///<returns></returns> publicDataTableGetUser(stringUsername) { stringsql="select*fromuserswhereusername=@username"; SqlParameter[]parameters=newSqlParameter[1]; parameters[1]=newSqlParameter("@username",SqlDbType.NVarChar,30); parameters[1].Value=Username; returnnewSqlDbHelper(connectionString).ExecuteDataTable(sql,CommandType.Text,parameters); } ///<summary> ///按照用户编号升序查询从指定位置开始的指定条数记录 ///</summary> ///<paramname="startIndex">查询的起始位置</param> ///<paramname="size">返回的最大记录条数</param> ///<returns></returns> publicDataTableGetUserList(intstartIndex,intsize) { stringsql="selecttop"+size+"*fromuserswhereUserIdnotin(selecttop"+startIndex+"UserIdfromUsersorderbyUserIdasc)orderbyUserIdasc"; returnnewSqlDbHelper(connectionString).ExecuteDataTable(sql); } ///<summary> ///查询用户总数 ///</summary> ///<returns></returns> publicintGetUserCount() { stringsql="selectcount(1)fromUsers"; returnint.Parse(newSqlDbHelper(connectionString).ExecuteScalar(sql).ToString()); } } } 然后创建业务逻辑层,代码如下: usingSystem; usingSystem.Collections.Generic; usingSystem.Text; usingDAL; usingEntity; usingSystem.Data; usingSystem.Data.SqlClient; usingSystem.Security.Cryptography; usingSystem.Security; namespaceBLL { publicclassUserBLL { privatestaticstringMD5Hash(stringpassword) { MD5md5=MD5.Create();//创建Md5算法实例 //将原始字符串转换成UTF-8编码的字节数组 byte[]sourceBytes=System.Text.Encoding.UTF8.GetBytes(password); //计算字节数组的哈希值 byte[]resultBytes=md5.ComputeHash(sourceBytes); StringBuilderbuffer=newStringBuilder(resultBytes.Length); //将计算得到的哈希值的字节数组中的每一个字节转换成十六进制形式 foreach(bytebinresultBytes) { buffer.Append(b.ToString("X")); } returnbuffer.ToString(); } ///<summary> ///添加用户 ///</summary> ///<paramname="info">用户的实体类</param> ///<returns></returns> publicstaticboolAddUser(UserInfoinfo) { UserDaldal=newUserDal(); DataTabledata=dal.GetUser(info.Username); if(data.Rows.Count>0) { returnfalse; } else { info.Password=MD5Hash(info.Password); returnnewUserDal().AddUser(info); } } ///<summary> ///删除用户 ///</summary> ///<paramname="userId">用户编号</param> ///<returns></returns> publicstaticboolDeleteUser(intuserId) { returnnewUserDal().DeleteUser(userId); } ///<summary> ///更新用户 ///</summary> ///<paramname="info">用户的实体类</param> ///<paramname="changePassword">是否需要对用户密码进行加密</param> ///<returns></returns> publicstaticboolUpdateUser(UserInfoinfo,boolchangePassword) { //如果更改密码就需要对新密码进行加密 //如果没有更改密码则不能对密码重复加密,否则会对用户造成无法登陆 if(changePassword) { info.Password=MD5Hash(info.Password); } returnnewUserDal().UpDateUser(info); } ///<summary> ///根据用户编号查询用户 ///</summary> ///<paramname="UserId">用户的编号</param> ///<returns></returns> publicstaticDataTableGetUser(intUserId) { returnnewUserDal().GetUser(UserId); } ///<summary> ///根据用户名查询用户信息 ///</summary> ///<paramname="userName">用户名</param> ///<returns></returns> publicstaticDataTableGetUser(stringuserName) { returnnewUserDal().GetUser(userName); } ///<summary> ///按照用户编号升序查询从指定位置开始的指定条数的记录 ///</summary> ///<paramname="startIndex">查询的起始位置</param> ///<paramname="size">返回的最大记录条数</param> ///<returns></returns> publicstaticDataTableGetUserList(intstartIndex,intsize) { returnnewUserDal().GetUserList(startIndex,size); } ///<summary> ///查询用户总数 ///</summary> ///<returns></returns> publicstaticintGetUserCount() { returnnewUserDal().GetUserCount(); } ///<summary> ///根据用户名或者用户编号从数据库查询对应记录的实体,如果不存在则返回null ///</summary> ///<paramname="userId">用户编号</param> ///<returns></returns> publicstaticUserInfoGetUserEntity(intuserId) { returnChangeToEntity(newUserDal().GetUser(userId)); } ///<summary> ///根据用户名或者用户编号从数据库查询对应记录的实体,如果不存在则返回null ///</summary> ///<paramname="userName">用户名</param> ///<returns></returns> publicstaticUserInfoGetUserEntity(stringuserName) { returnChangeToEntity(newUserDal().GetUser(userName)); } ///<summary> ///将包含Users表记录的DataTables中的第一条记录转换成Userinfo实体 ///</summary> ///<paramname="data"></param> ///<returns></returns> privatestaticUserInfoChangeToEntity(DataTabledata) { UserInfoinfo=null; //如果data不为空并且包含的记录条数大于0、 if(data!=null&&data.Rows.Count>0) { DataRowrow=data.Rows[0]; info=newUserInfo(); } returninfo; } publicstaticboolLogin(stringuserName,stringpassword) { boolexits=false; UserInfoinfo=GetUserEntity(userName); if(info!=null&&MD5Hash(password)==info.Password) { exits=true; info.LoginCount=info.LoginCount+1;//将用户登陆的次数加1 info.LastLoginDate=DateTime.Now;//将用户最后的登录时间设置为现在 UpdateUser(info,false);//更新用户的登陆次数和最后的登录时间 } returnexits; } } } 这个就完成了对数据库访问层,实体层,业务逻辑层的创建工作。因为在创建过程中被,有很多的重复的工作,我为了加快速度,就省略了一些的代码。 在登陆页面使用时,只需要引入业务逻辑层的方法,然后根据其中的方法,传入相应的参数,就可以完成所有的操作。 本文转自yisuowushinian 51CTO博客,原文链接:http://blog.51cto.com/yisuowushinian/1008416,如需转载请自行联系原作者