C#七層登陸及程式碼展示

提高班14期郭倩_Ulrica發表於2018-07-12

前言

一步一個腳印~
本篇文章僅為七層學習參考,熟悉七層走向,不涉及重構登陸。(缺失判斷邏輯)

七層登陸

what

注意指向問題。
錯誤圖:
包圖

正確圖:

正確

這個包圖很清晰的表示七層在三層的基礎上增加了facade,factory,IDAL層,Enitity。其實這裡的enitity就代表著實體層,在三層裡我們已經用過了,就是將User類封裝起來。也就是這裡所說的實體層。那麼我們今天要學習的也就又少了一個。增加的其他三層作用是什麼呢?
從圖上我們可以很清晰的知道這三層也是為了減少耦合的。

  1. facade(外觀層):較少U層和B層的耦合
  2. Factory(抽象工廠):實現了工廠模式+反射,使資料庫的修改更加簡便,通過修改配置檔案實現資料庫的修改
  3. IDAL(介面層):定義了一個統一的介面,減少了B層和D層的耦合
  4. 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(資料訪問層)

配置資料庫:
1

程式碼如下:

<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
            }
        } 

登陸效果

1

這裡寫圖片描述

錯誤集錦

錯誤集錦連結

後記

完成這個登陸還真是不容易啊。感謝大神們的幫助與指點~

相關文章