ASP.NET(MVC)三层架构知识的学习总结()转

至从使用过一次MVC进行团队开发后,体会到了面向对象开发软件的便利。使用MVC的时候,各个层之间的低耦合使得他们之间的联系非常的第,也就降低了模块之间的依赖程度。
首先介绍一下MVC的意义,和各个层面之间的用途和功能。
1)实体层。主要用来声明在视图层和业务逻辑层之间传递数据的载体。通常代表来源与项目数据库中一个或者多个表组成的一条有意义的记录。
2)业务逻辑层。根据业务逻辑向视图层提供数据,这个项目中的类有权根据业务逻辑来决定是否调用数据库访问层的方法
3)数据库访问层。项业务逻辑层提供访问数据的方法。
4)视图层。主要是以网站开发为例。用于提供显示,添加,编辑和删除数据。
我在VS中创建的项目的结构图:
 

NetMVC就是所谓的视图层。Entity是实体层,用来声明开发过程中被要使用的所有变量。DAL是数据库访问层,主要完成所有操作对数据库的访问。BLL是业务逻辑层,处理视图层传来的业务逻辑,然后传递给数据库访问层进行处理。
本例主要演示的是登陆页面的实现,Entity层的代码如下
 
using System;
using System.Collections.Generic;
using System.Text;
 
namespace Entity
{
    public class UserInfo
    {
        private int UserId;
 
        /// <summary>
        /// 用户比编号
        /// </summary>
        public int UserId1
        {
            get { return UserId; }
            set { UserId = value; }
        }
        private string username;
 
        /// <summary>
        /// 登录账户名称
        /// </summary>
        public string Username
        {
            get { return username; }
            set { username = value; }
        }
 
        private string password;
 
        /// <summary>
        /// 登录密码
        /// </summary>
        public string Password
        {
            get { return password; }
            set { password = value; }
        }
        private int loginCount;
 
        /// <summary>
        /// 登陆次数
        /// </summary>
        public int LoginCount
        {
            get { return loginCount; }
            set { loginCount = value; }
        }
        private DateTime regDate;
 
        /// <summary>
        /// 注册时间
        /// </summary>
        public DateTime RegDate
        {
            get { return regDate; }
            set { regDate = value; }
        }
        private DateTime lastLoginDate;
 
        /// <summary>
        /// 最后登录时间
        /// </summary>
        public DateTime LastLoginDate
        {
            get { return lastLoginDate; }
            set { lastLoginDate = value; }
        }
        private bool isForbidden;
        private string passwordQuestion;
 
        /// <summary>
        /// 找回密码提示问题
        /// </summary>
        public string PasswordQuestion
        {
            get { return passwordQuestion; }
            set { passwordQuestion = value; }
        }
        private string passwordAnswer;
 
        /// <summary>
        /// 找回密码答案
        /// </summary>
        public string PasswordAnswer
        {
            get { return passwordAnswer; }
            set { passwordAnswer = value; }
        }
 
 
    }
}
完成对实体类的创建,接着就要完成对数据库访问层的创建(其中需要用到上篇问章所写的SqlHelper数据库访问通用类 http://yisuowushinian.blog.51cto.com/4241271/999324 ),代码如下,
 
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using Entity;
 
namespace DAL
{
    public class UserDal
    {
        private string connectionString = ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString;
 
        /// <summary>
        /// 添加用户
        /// </summary>
        /// <param name="info">用户的实体类</param>
        /// <returns></returns>
        public bool AddUser(UserInfo info)
        {
            string sql = "insert into Users(Username,password) values(‘@Username‘,‘@password‘)";
            SqlParameter[] parameters = new SqlParameter[4];
            parameters[0] = new SqlParameter("@Username", SqlDbType.NVarChar, 30);
            parameters[0].Value = info.Username;
 
            parameters[1] = new SqlParameter("password", SqlDbType.VarChar, 50);
            parameters[1].Value = info.Password;
 
 
            return new SqlDbHelper(connectionString).ExecuteNonQuery(sql) > 0;
        }
 
        /// <summary>
        /// 删除用户
        /// </summary>
        /// <param name="UserId">用户编号</param>
        /// <returns></returns>
        public bool DeleteUser(int UserId)
        {
            string sql = "delete from users where UserId=" + UserId;
            return new SqlDbHelper(connectionString).ExecuteNonQuery(sql) > 0;
        }
 
        /// <summary>
        /// 更新用户
        /// </summary>
        /// <param name="info">用户的实体类</param>
        /// <returns></returns>
        public bool UpDateUser(UserInfo info)
        {
            string sql = "update users set [email protected],[email protected] where[email protected]";
            SqlParameter[] parameters = new SqlParameter[7];
            parameters[0] = new SqlParameter("@password", SqlDbType.VarChar, 30);
            parameters[0].Value = info.Password;
 
            parameters[1] = new SqlParameter("@loginCount", SqlDbType.Int, 4);
            parameters[1].Value = info.LoginCount;
 
            return new SqlDbHelper(connectionString).ExecuteNonQuery(sql) > 0;
        }
 
        /// <summary>
        /// 根据用户名或者用户编号查询用户
        /// </summary>
        /// <param name="userId">用户编号</param>
        /// <returns></returns>
        public DataTable GetUser(int userId)
        {
            string sql = "select * from users where [email protected]";
            SqlParameter[] parameters = new SqlParameter[1];
            parameters[0] = new SqlParameter("@UserId", SqlDbType.Int, 4);
            parameters[0].Value = userId;
            return new SqlDbHelper(connectionString).ExecuteDataTable(sql, CommandType.Text, parameters);
        }
 
        /// <summary>
        /// 根据用户名查询用户信息
        /// </summary>
        /// <param name="Username">用户名</param>
        /// <returns></returns>
        public DataTable GetUser(string Username)
        {
            string sql = "select * from users where [email protected]";
            SqlParameter[] parameters = new SqlParameter[1];
            parameters[1] = new SqlParameter("@username", SqlDbType.NVarChar, 30);
            parameters[1].Value = Username;
 
            return new SqlDbHelper(connectionString).ExecuteDataTable(sql, CommandType.Text, parameters);
        }
 
        /// <summary>
        /// 按照用户编号升序查询从指定位置开始的指定条数记录
        /// </summary>
        /// <param name="startIndex">查询的起始位置</param>
        /// <param name="size">返回的最大记录条数</param>
        /// <returns></returns>
        public DataTable GetUserList(int startIndex, int size)
        {
            string sql = "select top " + size + " * from users where UserId not in (select top " + startIndex + " UserId from Users order by UserId asc)order by UserId asc";
            return new SqlDbHelper(connectionString).ExecuteDataTable(sql);
        }
 
        /// <summary>
        /// 查询用户总数
        /// </summary>
        /// <returns></returns>
        public int GetUserCount()
        {
            string sql = "select count(1) from Users";
            return int.Parse(new SqlDbHelper(connectionString).ExecuteScalar(sql).ToString());
        }
    }
}
然后创建业务逻辑层,代码如下:
 
using System;
using System.Collections.Generic;
using System.Text;
 
using DAL;
using Entity;
using System.Data;
using System.Data.SqlClient;
using System.Security.Cryptography;
using System.Security;
 
namespace BLL
{
    public class UserBLL
    {
        private static string MD5Hash(string password)
        {
            MD5 md5 = MD5.Create();//创建Md5算法实例
            //将原始字符串转换成UTF-8编码的字节数组
            byte[] sourceBytes = System.Text.Encoding.UTF8.GetBytes(password);
            //计算字节数组的哈希值
            byte[] resultBytes = md5.ComputeHash(sourceBytes);
            StringBuilder buffer = new StringBuilder(resultBytes.Length);
            //将计算得到的哈希值的字节数组中的每一个字节转换成十六进制形式
            foreach (byte b in resultBytes)
            {
                buffer.Append(b.ToString("X"));
 
            }
            return buffer.ToString();
        }
 
        /// <summary>
        /// 添加用户
        /// </summary>
        /// <param name="info">用户的实体类</param>
        /// <returns></returns>
        public static bool AddUser(UserInfo info)
        {
            UserDal dal = new UserDal();
            DataTable data = dal.GetUser(info.Username);
            if (data.Rows.Count > 0)
            {
                return false;
            }
            else
            {
                info.Password =MD5Hash (info.Password);
                return new UserDal().AddUser(info);
            }
        }
 
        /// <summary>
        /// 删除用户
        /// </summary>
        /// <param name="userId">用户编号</param>
        /// <returns></returns>
        public static bool DeleteUser(int userId)
        {
            return new UserDal().DeleteUser(userId);
        }
 
        /// <summary>
        /// 更新用户
        /// </summary>
        /// <param name="info">用户的实体类</param>
        /// <param name="changePassword">是否需要对用户密码进行加密</param>
        /// <returns></returns>
        public static bool UpdateUser(UserInfo info, bool changePassword)
        {
            //如果更改密码就需要对新密码进行加密
            //如果没有更改密码则不能对密码重复加密,否则会对用户造成无法登陆
            if (changePassword)
            {
                info.Password = MD5Hash(info.Password);
            }
            return new UserDal().UpDateUser(info);
        }
 
        /// <summary>
        /// 根据用户编号查询用户
        /// </summary>
        /// <param name="UserId">用户的编号</param>
        /// <returns></returns>
        public static DataTable GetUser(int UserId)
        {
            return new UserDal().GetUser(UserId);
        }
 
        /// <summary>
        /// 根据用户名查询用户信息
        /// </summary>
        /// <param name="userName">用户名</param>
        /// <returns></returns>
        public static DataTable GetUser(string userName)
        {
            return new UserDal().GetUser(userName);
        }
 
        /// <summary>
        /// 按照用户编号升序查询从指定位置开始的指定条数的记录
        /// </summary>
        /// <param name="startIndex">查询的起始位置</param>
        /// <param name="size">返回的最大记录条数</param>
        /// <returns></returns>
        public static DataTable GetUserList(int startIndex, int size)
        {
            return new UserDal().GetUserList(startIndex, size);
        }
 
        /// <summary>
        /// 查询用户总数
        /// </summary>
        /// <returns></returns>
        public static int GetUserCount()
        {
            return new UserDal().GetUserCount();
        }
 
        /// <summary>
        /// 根据用户名或者用户编号从数据库查询对应记录的实体,如果不存在则返回null
        /// </summary>
        /// <param name="userId">用户编号</param>
        /// <returns></returns>
        public static UserInfo GetUserEntity(int userId)
        {
            return ChangeToEntity(new UserDal().GetUser(userId));
        }
 
        /// <summary>
        /// 根据用户名或者用户编号从数据库查询对应记录的实体,如果不存在则返回null
        /// </summary>
        /// <param name="userName">用户名</param>
        /// <returns></returns>
        public static UserInfo GetUserEntity(string userName)
        {
            return ChangeToEntity(new UserDal().GetUser(userName));
        }
 
        /// <summary>
        /// 将包含Users表记录的DataTables中的第一条记录转换成Userinfo实体
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        private static UserInfo ChangeToEntity(DataTable data)
        {
            UserInfo info = null;
            //如果data不为空并且包含的记录条数大于0、
            if (data!=null&&data.Rows.Count > 0)
            {
                DataRow row = data.Rows[0];
                info = new UserInfo();
 
            }
            return info;
        }
 
        public static bool Login(string userName, string password)
        {
            bool exits = false;
            UserInfo info = GetUserEntity(userName);
 
            if (info != null && MD5Hash(password) == info.Password)
            {
                exits = true;
                info.LoginCount = info.LoginCount + 1;//将用户登陆的次数加1
                info.LastLoginDate = DateTime.Now;//将用户最后的登录时间设置为现在
                UpdateUser(info, false);//更新用户的登陆次数和最后的登录时间
            }
            return exits;
        }
    }
}
 
这个就完成了对数据库访问层,实体层,业务逻辑层的创建工作。因为在创建过程中被,有很多的重复的工作,我为了加快速度,就省略了一些的代码。

时间: 2024-11-06 11:03:32

ASP.NET(MVC)三层架构知识的学习总结()转的相关文章

asp.net mvc 三层架构之dal层查询方法

分享分享分享!!! 首先,MVC和三层架构,是不一样的. 三层架构中,DAL(数据访问层).BLL(业务逻辑层).WEB层各司其职,意在职责分离. .net的三层结构中,并没有action这个概念. asp.net mvc 是微软新发布的一种网站开发架构.为了解决传统asp.net开发中不能分离Model,View和Controller而设计的. 普通的网站为了解决可移植,可维护,可扩展等问题,会把网站设计成三个独立的模块,Model负责数据库部分,View负责网页的界面,而Controller

(MVC)三层架构知识的学习总结

首先介绍一下MVC的意义,和各个层面之间的用途和功能. 1)实体层.主要用来声明在视图层和业务逻辑层之间传递数据的载体.通常代表来源与项目数据库中一个或者多个表组成的一条有意义的记录. 2)业务逻辑层.根据业务逻辑向视图层提供数据,这个项目中的类有权根据业务逻辑来决定是否调用数据库访问层的方法 3)数据库访问层.项业务逻辑层提供访问数据的方法. 4)视图层.主要是以网站开发为例.用于提供显示,添加,编辑和删除数据. 我在VS中创建的项目的结构图: NetMVC就是所谓的视图层.Entity是实体

asp.net mvc应用架构的思考--Unity的应用及三层代码

最近要做一个项目,和国外的架构师聊过之后.对方提到了他准备采用asp.net mvc, jquery, Unity 等技术来代替老的技术: 如asp.net web form. 他请我帮他想一些关于架构的东西.一直以来,关于asp.net mvc应用的架构,有一些想法.正好借这个机会写出来.资深的人士可能已经知道了,就当是复习吧.欢迎发表意见.指出不足. Unity的应用 Unity出来已经有几年了.早几年的1.2版就可以实现这里所说的功能.目前最新稳定版是2.1.正在开发的3.0也许会给我们带

ASP.NET典型三层架构企业级医药行业ERP系统实战

我这里有一套课程和大家分享,我的qq是2059055336,   课程说明: 国内首部完整讲述ERP系统架构.业务逻辑.开发的项目实战课程.考虑到本系统的庞大及复杂性.本课程原价购买学员每人赠送一个U盾设备,U盾可插在任意电脑上进行学习,使用方便,学习灵活!可永久学习! 项目由来: 此项目是讲师亲自参与构架及参与开发的大型ERP项目,此项目已被太阳石药业,九芝堂药业,拜欧药业等多家大中型企业使用,为其创造巨大经济价值.整个项目由10多个研发人员全程打造,项目总价值接近3000万,给企业创造的价值

ASP.NET的三层架构(DAL,BLL,UI)

BLL 是业务逻辑层 Business Logic Layer DAL 是数据访问层 Data Access Layer ASP.NET的三层架构(DAL,BLL,UI) 图形表示三层结构. 其中web即为USL层 web –> bll –> dal | | | | V | +–> model <-+ 一.三层体系架构 1.表示层(USL):主要表示WEB方式,也可以表示成WINFORM方式.如果逻辑层相当强大和完善,无论表现层如何定义和更改,逻辑层都能完善地提供服务. 2.业务逻

Angular JS从入门基础 mvc三层架构 常用指令

Angular JS从入门基础  mvc模型 常用指令 ★ 最近一直在复习AngularJS,它是一款优秀的前端JS框架,已经被用于Google的多款产品当中.AngularJS有着诸多特性,最为核心的是:MVC.模块化.自动化双向数据绑定.语义化标签.依赖注入等等. 1.常用指令 AngularJS 通过指令扩展了HTML,且通过表达式绑定数据到 HTML.下面我们看一下AngularJS中的常用指令. (1).基本概念 指令:AngularJS中,通过扩展HTML的属性提供功能.所以,ng-

asp.net中三层架构与mvc之区别?

对于标题中的问题,如果是没有同时接触三层架构和mvc的初级.net开发人员,想必一定会非常糊涂和混淆.关于此我也百度过N回,看过N多帖子和 回答,但几乎没有人能表述清楚.近期我从典型mvc+entityframework开发模式转型为三层架构的webform模式,才真正了解了二者的概 念. 一言以概之,采用mvc的同时,也可以采用三层架构,这二者没有直接关系. 三层架构中有一层UI层,或叫web层,我们所做的mvc项目都是依托于三层架构中的UI层而言的.mvc的概念主要是相对于webform中视

SpringMVC学习一、MVC三层架构与SpringMVC原理

SpringMVC SSM:Mybatis + Spring + SpringMVC MVC MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范. 是将业务逻辑.数据.显示分离的方法来组织代码 MVC主要作用是降低了视图与业务逻辑间的双向耦合 MVC不是设计模式,是一种架构模式.不同的MVC存在差异 Model(模型):数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型或JavaBean组件(包含数据和行为),不过现在一般都分离

asp.net+mvc+easyui+sqlite 简单用户系统学习之旅

首次接触asp.net开发,希望把自己的学习之旅写下来,一方面做个知识归纳技术总结,另一方面开放到博客中,和大家一起交流学习! asp.net是目前流行的web开发技术之一,是微软旗下开发的基于.net framework的一套免费的网络应用框架.因为其强大专业的后台支持,和配套优秀的vs开发工具,越来越成为web开发者和公司的选择.学习asp.net可以参考极客学院的知识体系图. http://www.jikexueyuan.com/path/aspdotnet/ 1. C#语言基础 2. A