C#七層登陸及程式碼展示
前言
一步一個腳印~
本篇文章僅為七層學習參考,熟悉七層走向,不涉及重構登陸。(缺失判斷邏輯)
七層登陸
what
注意指向問題。
錯誤圖:
正確圖:
這個包圖很清晰的表示七層在三層的基礎上增加了facade,factory,IDAL層,Enitity。其實這裡的enitity就代表著實體層,在三層裡我們已經用過了,就是將User類封裝起來。也就是這裡所說的實體層。那麼我們今天要學習的也就又少了一個。增加的其他三層作用是什麼呢?
從圖上我們可以很清晰的知道這三層也是為了減少耦合的。
- facade(外觀層):較少U層和B層的耦合
- Factory(抽象工廠):實現了工廠模式+反射,使資料庫的修改更加簡便,通過修改配置檔案實現資料庫的修改
- IDAL(介面層):定義了一個統一的介面,減少了B層和D層的耦合
- Enitity(實體層):封裝一些功能性程式碼,定義一些實體型別和實體集合用於各個層次傳遞引數
程式碼順序
注意:先後問題。如果先寫U層,它會涉及到呼叫,所以在沒寫B層之前,U層是無法完成的。寫程式碼順序應從箭頭指向的反方向來寫。
1. Enitity(實體層)
2. IDAL(介面層)
3. DAL(資料訪問層)
→app配置
4. Factory(工廠層)
5. BLL(業務邏輯層)
6. Facade(外觀曾)
7. UI(介面層)
程式碼展示
Enitity(實體層)
public class userinfo
{
public string UserID { get; set; }
public string PWD { get; set; }
public string UserName { get; set; }
public string Level { get; set; }
public string state { get; set; }
}
IDAL(介面層)
using System.Data;//引用
namespace IDAL
{
public interface LoginIDAL
{
DataTable selectUser(Entity.userinfo user);
}
}
DAL(資料訪問層)
配置資料庫:
程式碼如下:
<appSettings>
<add key ="connStr" value ="server=LOVQG\SQLEXPRESS;database=Login_sys;uid=sa;pwd= 123"/>
<add key ="DB" value ="DAL"/>
</appSettings>
DAL類:
using System.Data; //引用
using System.Data.SqlClient;
using System.Configuration;
namespace DAL
{
public class LoginDAL:IDAL.LoginIDAL
{
public DataTable selectUser(Entity.userinfo user)
{
SQLHelper sqlHelper = new SQLHelper();
//引數
SqlParameter[] sqlparams = { new SqlParameter("@UserID", user.UserID), new SqlParameter("@PassWord", user.PWD) };
string sql = @"SELECT * FROM [User_Info] WHERE UserID =@UserID AND PWD = @PassWord";
DataTable table = sqlHelper.ExecuteQuery(sql, sqlparams, CommandType.Text); //(sql, CommandType.Text, sqlparams);
return table;
}
}
}
SQLHelper類:
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
namespace DAL
{
public class SQLHelper
{
private SqlConnection conn = null;
private SqlCommand cmd = null;
private SqlDataReader sdr = null;
//----------------------
public SQLHelper()
{
//連線
string connStr = ConfigurationManager.AppSettings["connStr"];
conn = new SqlConnection(connStr);
}
//----------------------
private SqlConnection Getconn() //需有返回值
{
if (conn.State == ConnectionState.Closed)
{
conn.Open(); //開啟資料庫
}
return conn;
}
//---------------------
/// <summary>
/// 執行帶引數的查詢SQL語句或儲存過程
/// </summary>
/// <param name="cmdText">查詢SQL語句或儲存過程</param>
/// <param name="paras">引數集合</param>
/// <param name="ct">命令型別</param>
/// <returns></returns>
public DataTable ExecuteQuery(string cmdText, SqlParameter[] paras, CommandType ct)
{
DataTable dt = new DataTable();
cmd = new SqlCommand(cmdText, Getconn());
cmd.CommandType = ct;
cmd.Parameters.AddRange(paras);
using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
dt.Load(sdr);
}
return dt;
}
}
}
Factory(工廠層)
using System.Reflection;//引用反射
using System.Configuration;
namespace Factory
{
public class LoginFactory
{
//新增引用集
string StrDB = System.Configuration.ConfigurationManager.AppSettings["DB"];
public IDAL.LoginIDAL CreateUser()
{
//反射+工廠的應用----------新增引用using System.Reflection;
string ClassName = StrDB + "." + "LoginDAL";//DAL的類名 StrDB+
return (IDAL.LoginIDAL)Assembly.Load(StrDB).CreateInstance(ClassName);
}
}
}
BLL(業務邏輯層)
using System.Data;
namespace BLL
{
public class LoginBLL
{
public DataTable UserBLL(Entity.userinfo user)
{
Factory.LoginFactory fact = new Factory.LoginFactory();//例項化工廠
IDAL.LoginIDAL idal = fact.CreateUser();//呼叫工廠方法建立介面
DataTable table = idal.selectUser(user);//接受D層的返回值
return table;
}
}
}
Facade(外觀層)
public class LoginFacade
{
public DataTable SelectUser(Entity.userinfo user)
{
DataTable flag;
BLL.LoginBLL UserBLL = new BLL.LoginBLL();
flag = UserBLL.UserBLL(user);//返回值
return flag;
}
}
UI(介面層)→未判斷許可權~
private void buttonOK_Click(object sender, EventArgs e)
{
//判空
if (txtUserID.Text.Trim() == "") //1.判斷使用者名稱和密碼是否為空,一行程式碼解決
{
MessageBox.Show("使用者名稱不能為空!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
if (txtPassWord.Text == "")
{
MessageBox.Show("密碼不能為空!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
txtPassWord.Focus();
}
else
{
Entity.userinfo user = new Entity.userinfo(); //例項化使用者
user.UserID = txtUserID.Text.Trim(); //接收資訊
user.PWD = txtPassWord.Text; //
Facade.LoginFacade FLogin = new Facade.LoginFacade(); //3.例項化外觀將引數傳遞給外觀層
DataTable flag = FLogin.SelectUser(user); //4.呼叫外觀的方法,返回給user
#region//判斷登陸
if (flag.Rows.Count != 0) //-------為什麼不用布林值,bool無法返回rowx
{
MessageBox.Show("小主,您可以進來了", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
this.Hide();
this.DialogResult = System.Windows.Forms.DialogResult.OK;
Form a = new Form();
a.Show();
}
else
{
MessageBox.Show("使用者名稱或密碼錯誤");
txtUserID.Text = "";
txtPassWord.Text = "";
txtUserID.Focus();//獲得焦點
}
#endregion
}
}
登陸效果
錯誤集錦
後記
完成這個登陸還真是不容易啊。感謝大神們的幫助與指點~
相關文章
- 三層登陸程式碼及錯誤集錦
- 單點登陸原理及程式碼(CAS)
- 機房重構七層登陸之錯誤集錦
- SSH安全登陸原理:密碼登陸與公鑰登陸密碼
- discuz教程QQ登陸提示錯誤程式碼:2000
- 登陸註冊頁面html程式碼(仿知乎)HTML
- 配置SSH免密碼登陸密碼
- Jupyter Notebook修改登陸密碼密碼
- 【Python】python程式碼來登陸網站簽到米粒VPNPython網站
- vue+elementUI完成註冊及登陸VueUI
- shiro登陸流程原始碼詳解原始碼
- shiro多realm配置免密碼登陸密碼
- CentOS7 配置免密碼登陸CentOS密碼
- tp登陸
- 共享登陸
- 第三方登陸:微信掃碼登入
- Linux配置SSH免密登陸(公私鑰登陸)Linux
- C# 介面跳轉-登陸之後跳轉至主視窗C#
- Go 語言實現 QQ 掃碼登陸Go
- SpringSceurity(5)---簡訊驗證碼登陸功能Spring
- 淺談微信小程式登陸與Oauth微信小程式OAuth
- ssh直接帶密碼登入Linux,Linux自動密碼登陸利器sshpass密碼Linux
- win10登陸密碼取消不了怎麼辦_win10登陸密碼取消不了的解決方法Win10密碼
- 登陸驗證
- postgresql如何登陸SQL
- 單點登陸
- koa2+vue實現登陸以及是否登陸控制Vue
- PbootCMS後臺登陸密碼忘記/找回後臺登入密碼外掛boot密碼
- PbootCMS後臺登陸密碼忘記/找回密碼後臺登入密碼外掛boot密碼
- 密碼過期引起的ssh無法登陸密碼
- PbootCms後臺登陸不顯示驗證碼boot
- BPI-M4 Berry自動登陸及關閉桌面
- 請簡述OSI七層網路模型有哪些層及各自的含義?模型
- 易優cms網站後臺登陸驗證碼錯誤,如何不使用驗證碼登陸?或者如何修復?網站
- vnc登陸,7個步驟在CentOS 7下vnc登陸VNCCentOS
- spring原始碼解析 (七) 事務底層原始碼實現Spring原始碼
- android HAL層程式碼Android
- iOS逆向——Method Swizzle及WeChat註冊、登入程式碼示例iOS