機房重構- 登錄窗體

從三層到七層的變化   使得我都不知道從哪裏下手了,其中增加了一個外觀層(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;
        }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章