1. 程式人生 > >【C#】機房重構之七層登陸

【C#】機房重構之七層登陸

what?

  1. 實體層(Entity):主要是用來封裝一些功能性程式碼,定義實體型別和實體集合,用於各層次傳遞引數
  2. 資料訪問層(DAL):提供基本的資料訪問,該層將有關資料庫的操作放在單獨的一個類中,針對資料的增刪改查
  3. 介面層(IDAL):定義一個統一的介面,解除B層與D層的耦合
  4. 工廠層(Factory):登入中用到的是抽象工廠+反射+配置檔案。靈活的實現了資料庫的連線,提高了程式碼的靈活性
  5. 業務邏輯層(BLL):負責處理業務邏輯
  6. 外觀層(Facade):此處運用了外觀模式,層與層之間不直接產生聯絡,解除了B層與U層之間的耦合。
  7. 表示層(UI):
    只負責顯示和採集使用者操作,不包含任何的業務相關的邏輯處理。

UML圖

這裡寫圖片描述
包圖之間的關係更加形象的描繪了各個層之間的關係。除了D層與介面層之間是實現關係,其他包之間都是依賴關係。同時也表明了在程式碼中如何編寫的問題。(UML包圖瞭解)【此資源來自百度,如有侵權,還請告知,定馬上刪除】

三層與七層

三層是學習七層的基礎,將三層學習的很精,在學習七層的時候就會很容易,七層只是在三層的基礎上多了外觀層,介面層,工廠層和實體層。外觀層的存在是為了解除解除了B層與U層之間的耦合,介面層的存在是為了解除B層與D層的耦合,而實體層在學習三層的時候也出現了,工廠層是為了提高程式碼的靈活性。

程式碼實現

Entity層

        //定義變數
        private string _userid; //使用者ID
        private string _username;//使用者名稱字
        private string _password;//密碼
        //封裝變數
        public string UserId
        {
            get
            {
                return _userid;
            }

            set
            {
                _userid = value
; } } public string Username { get { return _username; } set { _username = value; } } public string Password { get { return _password; } set { _password = value; } }

DAL層
loginDAL

    public class LoginDAL : IDAL.LoginIDAL
    {
        public DataTable selectUser(Entity.UserInfo userInfo)
        {
            SQLHelper sqlHelper = new SQLHelper();
            SqlParameter[] sqlParams = { new SqlParameter("@userID", userInfo.UserId), new SqlParameter("@passWord",userInfo.Password) };
            string sql = @"select * from User_info where [email protected] and [email protected]";
            DataTable table = sqlHelper.ExecuteQuery(sql,sqlParams,CommandType.Text);
            return table;
        }
    }

SQLHelper

    public class SQLHelper
    {
        private SqlConnection conn = null;
        private SqlCommand cmd = null;
        private SqlDataReader sdr = null;

        public SQLHelper()
        {

            string connStr = System.Configuration.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;

        }

IDAL層

    public interface LoginIDAL
    {
        DataTable selectUser(Entity.UserInfo userInfo);
    }

Factory層

public class LoginFactory
    {
        string strDB = System.Configuration.ConfigurationManager.AppSettings["DB"];
        public IDAL.LoginIDAL CreateUser()
        {
            string ClassName = strDB + "." + "LoginDAL";
            return (IDAL.LoginIDAL)Assembly.Load(strDB).CreateInstance(ClassName);//反射的應用
        }
    }

BLL層

 public class LoginBLL
    {
        public bool UserBLL(Entity.UserInfo UserInfo)
        {
            Factory.LoginFactory fact = new Factory.LoginFactory(); //例項化工廠
            IDAL.LoginIDAL idal = fact.CreateUser();//呼叫工廠方法建立介面
            DataTable table = idal.selectUser(UserInfo);
            bool flag;
            if (table.Rows.Count==0)
            {
                flag = false;
            }
            else
            {
                flag = true;
            }

            return flag;
        }
    }

Facade層

 public class LoginFacade
    {
        public Boolean selectUser(Entity.UserInfo user)
        {
            bool flag;
            BLL.LoginBLL userBLL = new BLL.LoginBLL();
            flag = userBLL.UserBLL(user);
            return flag;
        }
    }

UI層

            if (txtUserNme.Text == "")
            {
                MessageBox.Show("請您輸入使用者名稱!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                txtUserNme.Focus();
            }

            else if (txtPassWord.Text == "")
            {
                MessageBox.Show("請您輸入密碼!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                txtPassWord.Focus();
            }
            else 
            {
                try
                {
                    //例項化實體類
                    Facade.LoginFacade loginFacade = new Facade.LoginFacade();

                    //DataTable UserBack = new DataTable();
                    Entity.UserInfo User = new Entity.UserInfo();
                    //將輸入的使用者名稱和密碼賦值給定義的變數
                    User.UserId = Convert.ToString(txtUserNme.Text.Trim());
                    User.Password = Convert.ToString(txtPassWord.Text.Trim());

                    Boolean flag = false;
                    flag = loginFacade.selectUser(User);

                    if (flag != false)
                    {
                        this.Hide();
                        this.DialogResult = System.Windows.Forms.DialogResult.OK;
                        frmMain frmMain = new frmMain();
                        frmMain.Show();
                    }
                    else
                    {
                        MessageBox.Show("使用者名稱或者密碼錯誤", "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
                catch (Exception ex)
                {
                    throw ex;

                }

總結

七層登陸是一個簡單練手的功能,也是對七層架構的初步認識,通過看“巨人們”的部落格,讓我對七層有了更多的瞭解。