【ASP.NET开发】ASP.NET(MVC)三层架构知识的学习总结
至從使用過一次MVC進行團隊開發(fā)后,體會到了面向?qū)ο箝_發(fā)軟件的便利。使用MVC的時候,各個層之間的低耦合使得他們之間的聯(lián)系非常的第,也就降低了模塊之間的依賴程度。
首先介紹一下MVC的意義,和各個層面之間的用途和功能。
1)實體層。主要用來聲明在視圖層和業(yè)務(wù)邏輯層之間傳遞數(shù)據(jù)的載體。通常代表來源與項目數(shù)據(jù)庫中一個或者多個表組成的一條有意義的記錄。
2)業(yè)務(wù)邏輯層。根據(jù)業(yè)務(wù)邏輯向視圖層提供數(shù)據(jù),這個項目中的類有權(quán)根據(jù)業(yè)務(wù)邏輯來決定是否調(diào)用數(shù)據(jù)庫訪問層的方法
3)數(shù)據(jù)庫訪問層。項業(yè)務(wù)邏輯層提供訪問數(shù)據(jù)的方法。
4)視圖層。主要是以網(wǎng)站開發(fā)為例。用于提供顯示,添加,編輯和刪除數(shù)據(jù)。
我在VS中創(chuàng)建的項目的結(jié)構(gòu)圖:
NetMVC就是所謂的視圖層。Entity是實體層,用來聲明開發(fā)過程中被要使用的所有變量。DAL是數(shù)據(jù)庫訪問層,主要完成所有操作對數(shù)據(jù)庫的訪問。BLL是業(yè)務(wù)邏輯層,處理視圖層傳來的業(yè)務(wù)邏輯,然后傳遞給數(shù)據(jù)庫訪問層進行處理。
本例主要演示的是登陸頁面的實現(xiàn),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>/// 登陸次數(shù)/// </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; }}} }完成對實體類的創(chuàng)建,接著就要完成對數(shù)據(jù)庫訪問層的創(chuàng)建(其中需要用到上篇問章所寫的SqlHelper數(shù)據(jù)庫訪問通用類http://www.cnblogs.com/qq731109249/archive/2012/09/20/2694952.html),代碼如下,
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 password=@password,loginCount=@loginCount where userid=@userid";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>/// 根據(jù)用戶名或者用戶編號查詢用戶/// </summary>/// <param name="userId">用戶編號</param>/// <returns></returns>public DataTable GetUser(int userId){string sql = "select * from users where userId=@UserId";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>/// 根據(jù)用戶名查詢用戶信息/// </summary>/// <param name="Username">用戶名</param>/// <returns></returns>public DataTable GetUser(string Username){string sql = "select * from users where username=@username";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>/// 按照用戶編號升序查詢從指定位置開始的指定條數(shù)記錄/// </summary>/// <param name="startIndex">查詢的起始位置</param>/// <param name="size">返回的最大記錄條數(shù)</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>/// 查詢用戶總數(shù)/// </summary>/// <returns></returns>public int GetUserCount(){string sql = "select count(1) from Users";return int.Parse(new SqlDbHelper(connectionString).ExecuteScalar(sql).ToString());}} }然后創(chuàng)建業(yè)務(wù)邏輯層,代碼如下:
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();//創(chuàng)建Md5算法實例//將原始字符串轉(zhuǎn)換成UTF-8編碼的字節(jié)數(shù)組byte[] sourceBytes = System.Text.Encoding.UTF8.GetBytes(password);//計算字節(jié)數(shù)組的哈希值byte[] resultBytes = md5.ComputeHash(sourceBytes);StringBuilder buffer = new StringBuilder(resultBytes.Length);//將計算得到的哈希值的字節(jié)數(shù)組中的每一個字節(jié)轉(zhuǎn)換成十六進制形式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){//如果更改密碼就需要對新密碼進行加密//如果沒有更改密碼則不能對密碼重復(fù)加密,否則會對用戶造成無法登陸if (changePassword){info.Password = MD5Hash(info.Password);}return new UserDal().UpDateUser(info);}/// <summary>/// 根據(jù)用戶編號查詢用戶/// </summary>/// <param name="UserId">用戶的編號</param>/// <returns></returns>public static DataTable GetUser(int UserId){return new UserDal().GetUser(UserId);}/// <summary>/// 根據(jù)用戶名查詢用戶信息/// </summary>/// <param name="userName">用戶名</param>/// <returns></returns>public static DataTable GetUser(string userName){return new UserDal().GetUser(userName);}/// <summary>/// 按照用戶編號升序查詢從指定位置開始的指定條數(shù)的記錄/// </summary>/// <param name="startIndex">查詢的起始位置</param>/// <param name="size">返回的最大記錄條數(shù)</param>/// <returns></returns>public static DataTable GetUserList(int startIndex, int size){return new UserDal().GetUserList(startIndex, size);}/// <summary>/// 查詢用戶總數(shù)/// </summary>/// <returns></returns>public static int GetUserCount(){return new UserDal().GetUserCount();}/// <summary>/// 根據(jù)用戶名或者用戶編號從數(shù)據(jù)庫查詢對應(yīng)記錄的實體,如果不存在則返回null/// </summary>/// <param name="userId">用戶編號</param>/// <returns></returns>public static UserInfo GetUserEntity(int userId){return ChangeToEntity(new UserDal().GetUser(userId));}/// <summary>/// 根據(jù)用戶名或者用戶編號從數(shù)據(jù)庫查詢對應(yīng)記錄的實體,如果不存在則返回null/// </summary>/// <param name="userName">用戶名</param>/// <returns></returns>public static UserInfo GetUserEntity(string userName){return ChangeToEntity(new UserDal().GetUser(userName));}/// <summary>/// 將包含Users表記錄的DataTables中的第一條記錄轉(zhuǎn)換成Userinfo實體/// </summary>/// <param name="data"></param>/// <returns></returns>private static UserInfo ChangeToEntity(DataTable data){UserInfo info = null;//如果data不為空并且包含的記錄條數(shù)大于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;//將用戶登陸的次數(shù)加1info.LastLoginDate = DateTime.Now;//將用戶最后的登錄時間設(shè)置為現(xiàn)在UpdateUser(info, false);//更新用戶的登陸次數(shù)和最后的登錄時間}return exits;}} }這個就完成了對數(shù)據(jù)庫訪問層,實體層,業(yè)務(wù)邏輯層的創(chuàng)建工作。因為在創(chuàng)建過程中被,有很多的重復(fù)的工作,我為了加快速度,就省略了一些的代碼。
?在登陸頁面使用時,只需要引入業(yè)務(wù)邏輯層的方法,然后根據(jù)其中的方法,傳入相應(yīng)的參數(shù),就可以完成所有的操作。
轉(zhuǎn)載于:https://www.cnblogs.com/yisuowushinian/archive/2012/09/27/2706038.html
總結(jié)
以上是生活随笔為你收集整理的【ASP.NET开发】ASP.NET(MVC)三层架构知识的学习总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Thread.join()练习
- 下一篇: 读《瓦尔登湖》,寂寞的共鸣