從三層到七層的變化 使得我都不知道從哪裏下手了,其中增加了一個外觀層(Facade)和一個工廠層(Factory)另外還有了一個接口。而這些層與層之間 都有自己的職能。但是總的核心就是:“解耦”。 開始機房重構有一段時間了,現在回想一下自己當時敲登陸窗體的時候遇到了各種各樣的問題,例如代碼的邏輯走不通,不知道該什麼時候調用 一系列問題。
實現步驟:
1、創建Entity,實現業務實體。
2、創建IDAL,實現接口。
3、創建DAL,實現接口裏的方法。
4、增加APP.config裏的配置信息,爲提供DAL的程序集。
5、創建Factory,返回程序集的指定類的實例。
6、創建BLL,調用Factory,得到程序集指定類的實例,完成數據操作方法。
7、創建Facade,調用BLL,得到BLL層的處理結果返回值。
8、創建UI,調用Facade裏的數據操作方法,實現登錄。
代碼實現
Entity
public class UserInfo
{
//定義 用戶ID 字段
private string userid;
public string UserID
{
get { return userid; }
set { userid = value; }
}
//定義 密碼 字段
private string password;
public string Password
{
get { return password; }
set { password = value; }
}
}
IDAL層
namespace IDAL
{
public interface LoginIDAL
{
DataTable selectUser(Entity.UserInfo UserInfo);
}
}
DAL層
public class LoginDAL : IDAL.LoginIDAL
{
public DataTable selectUser(Entity.UserInfo UserInfo) //selectUser該方法即是IDAL接口的方法
{
SQLHelper SQLHelper = new SQLHelper(); //實例化 跳轉到SQLHelper層
//聲明一個SQL參數的數組 params可變數組
SqlParameter[] sqlParams = { new SqlParameter("@txtUserID", UserInfo.UserID), new SqlParameter("@txtPWD", UserInfo.Password) }; //用戶名和密碼
string sql = @"SELECT * FROM User_Info WHERE UserID=@txtUserID and PWD=@txtPWD"; //查的語句用戶名和密碼相等並且狀態爲 True and state = 'True'
DataTable table = SQLHelper.ExecuteQuery(sql, sqlParams, CommandType.Text);
return table;
}
}
SQLHelper
public class SQLHelper
{
#region 構造函數
private SqlConnection conn = null; //SqlConnection 打開連接
private SqlCommand cmd = null; //SqlCommand對象允許你指定在數據庫上執行的操作的類型。比如,你能夠對數據庫中的行數據執行select,insert,modify以及delete命令。
//SqlCommand對象能被用來支持斷開連接數據管理的情況,可以只單獨使用SqlCommand對象。也可以與SqlDataAdapter一起實現斷開數據連接,實現操作數據庫的應用程序
private SqlDataReader sdr = null; //讀取只進的行流的方式
public SQLHelper()
{
string connStr = ConfigurationManager.AppSettings["connStr"]; //ConnStr 是配置文件裏連接數據庫的關鍵字,引用這一句可以連接數據庫
conn = new SqlConnection(connStr); //實例化一個連接
}
#endregion
#region SQL連接打開
private SqlConnection GetConn()
{
if (conn.State == ConnectionState.Closed) //如果連接狀態爲關閉
{
conn.Open(); //則打開
}
return conn;
}
#endregion
#region 非存儲過程
/// <summary>
/// 執行不帶參數的的 增刪改 SQL語句或者存儲過程
/// </summary>
/// <param name="cmdText">增刪改SQL</param>
/// <param name="ct">命令類型</param>
/// <returns>返回受影響的行數</returns>
public int ExecuteNonQuery(string cmdText, CommandType ct)
//增刪改 SQL 命令類型
{
int res;
try
{
cmd = new SqlCommand(cmdText, GetConn()); //打開連接
cmd.CommandType = ct;
res = cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (conn.State == ConnectionState.Open)
{
conn.Close(); //關閉數據庫 與上面相對應
}
}
return res;
}
/// <summary>
/// 執行帶參數的的 增刪改 SQL語句或者存儲過程
/// </summary>
/// <param name="cmdText">增刪改SQL</param>
/// <param name="paras">要查詢的參數</param>
/// <param name="ct">命令類型</param>
/// <returns>返回受影響的行數</returns>
public int ExecuteNonQuery(string cmdText, SqlParameter[] paras, CommandType ct)
{
int res;
using (cmd = new SqlCommand(cmdText, GetConn())) //使用using,可以自動關閉數據庫
{
cmd.CommandType = ct;
cmd.Parameters.AddRange(paras);
res = cmd.ExecuteNonQuery();
}
return res;
}
/// <summary>
/// 執行不帶參數的 查詢 SQL語句或存儲過程
/// </summary>
/// <param name="cmdText">查詢SQL語句或存儲過程</param>
/// <param name="ct">命令類型</param>
/// <returns></returns>
public DataTable ExecuteQuery(string cmdText, CommandType ct)
{
DataTable dt = new DataTable();
cmd = new SqlCommand(cmdText, GetConn());
cmd.CommandType = ct;
using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
dt.Load(sdr);
}
return dt;
}
/// <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;
}
#endregion
}
App
<appSettings>
<add key="ConnStr" value="server=TZK;database=jifang;uid=sa;pwd=123456"/>
<add key="DB" value="DAL"/>
<!--ConnStr 爲 連接數據庫 key爲鍵值,引用字符DB,value代表引用的真正的內容-->
</appSettings>
Factory
public class LoginFactory
{
string StrDB = System.Configuration.ConfigurationManager.AppSettings["DB"]; //接收來自配置文件的數據
public IDAL.LoginIDAL CreateUser()
{
string ClassName = StrDB + "." + "LoginDAL"; //這裏的LoginDAL是D層的類名
return (IDAL.LoginIDAL)Assembly.Load(StrDB).CreateInstance(ClassName); //反射加工廠的應用
}
}
BLL
public class LoginBLL
{
public bool UserBLL(Entity.UserInfo UserInfo)
{
Factory.LoginFactory fact = new Factory.LoginFactory(); //實例化工廠 跳轉到Factory層 接收配置文件的數據,接收完成之後再回來
IDAL.LoginIDAL idal = fact.CreateUser(); //調用工廠方法創建接口 跳轉Factory 使用CreateUser的方法
DataTable table = idal.selectUser(UserInfo); //接收D層的返回值 跳轉到DAL層
bool flag;
if (table.Rows.Count == 0) //返回DataTable類型,如果他的行數等於0,說明沒有符合該賬號密碼的用戶
{
flag = false;
}
else
{
flag = true;
}
return flag;
}