【ASP.NET開發】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://blog.csdn.net/yisuowushinian/article/details/7999305),程式碼如下,
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>
/// 根據使用者名稱或者使用者編號查詢使用者
/// </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>
/// 根據使用者名稱查詢使用者資訊
/// </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>
/// 按照使用者編號升序查詢從指定位置開始的指定條數記錄
/// </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;
}
}
}
這個就完成了對資料庫訪問層,實體層,業務邏輯層的建立工作。因為在建立過程中被,有很多的重複的工作,我為了加快速度,就省略了一些的程式碼。
在登陸頁面使用時,只需要引入業務邏輯層的方法,然後根據其中的方法,傳入相應的引數,就可以完成所有的操作。
相關文章
- ASp.net 剖析三層架構ASP.NET架構
- ASP.NET知識總結ASP.NET
- Asp.net 2.0三層架構的構建與理解ASP.NET架構
- MVC 與三層架構MVC架構
- asp.net標準三層架構--工廠模式ASP.NET架構模式
- ASP.NET 的MVC結構之AJAXASP.NETMVC
- MVC專案實踐,在三層架構下實現SportsStore-09,ASP.NET MVC呼叫ASP.NET Web API的查詢服務MVC架構ASP.NETWebAPI
- ASP.Net MVC開發基礎學習筆記(1):走向MVC模式ASP.NETMVC筆記模式
- ASP.NET MVC5 知識點整理ASP.NETMVC
- ASP.NET網站開發--關於對三層架構(例:請假管理系統)的個人認識詳情ASP.NET網站架構
- 架構知識體系總結架構
- 瞭解ASP.NET底層架構ASP.NET架構
- 從MVC和三層架構說到ssh整合開發(下)MVC架構
- 從MVC和三層架構說到ssh整合開發(上)MVC架構
- 【三層學習之總結】
- MVC與三層架構區別MVC架構
- 說說三層架構和MVC架構MVC
- ASP.NET 2.0 URL Rewrite 學習總結ASP.NET
- net三層架構與MVC的區別架構MVC
- 學習ASP.NET MVC(六)——我的第一個ASP.NET MVC 編輯頁面ASP.NETMVC
- 開發asp.net自定義控制元件(asp.net學習筆記三) (轉)ASP.NET控制元件筆記
- ASP.NET MVC同步和非同步的使用總結ASP.NETMVC非同步
- Java Web(八) MVC和三層架構JavaWebMVC架構
- Asp.Net MVC 學習心得 之 Html HelperASP.NETMVCHTML
- 架構知識點(三)架構
- Vue學習知識點總結Vue
- asp.net 常用知識點彙總整理ASP.NET
- [ASP.NET MVC 小牛之路]02 - C#知識點提要ASP.NETMVCC#
- ASP.NET中的AJAX應用開發總結ASP.NET
- MVC 三層架構案例詳細講解MVC架構
- 前端開發知識結構前端
- 架構系列:ASP.NET 專案結構搭建架構ASP.NET
- 支付業務與技術架構學習總結(12)——支付風控相關知識小結架構
- 基於三層架構的增刪改查Get知識點架構
- ASP.NET MVC學習筆記:(一)路由匹配ASP.NETMVC筆記路由
- ASP.NET MVC學習之模型驗證篇ASP.NETMVC模型
- Asp.Net MVC4 + Oracle + EasyUI 學習 序章ASP.NETMVCOracleUI
- .NET/ASP.NET MVC(模組化開發AraeRegistration)ASP.NETMVC