三層登入——C#版

周麗同發表於2016-01-25

前言

    前期瞭解三層架構主要是由UI層、BLL層和DAL層三部分構成。看到大牛們都採用三層的思想實現了登入,本菜鳥暗暗地站在了他們的肩膀上。

自己理解

    對於三層自己的理解是:就像我們對一個大型的公司去找人門口一定會有門衛,假設你就是一個使用者,要去公司找該總經理洽談業務。這時你會來到門口(UI層),要進去找人,門衛(BLL層)說:“你是誰?你找誰?幹什麼?等等各種問題。”然後接著就去查詢檔案(DAL層)。確定總經理是否認識這麼個人。就這樣“UI層——>BLL層——>DAL層”,然後DAL層給予迴應見還是不見;傳輸層為:“DAL層——>BLL層——>UI層”。

    這樣門衛因為自己根本不認識這個人,所以不能因為不讓他見總經理而得罪他,起到了一個“橋”的作用。在軟體開發中,這樣有利於減少程式碼之間的耦合度。從而方便了後期的維護,大大減輕了軟體危機的到來。很棒吧~~~

三層架構優缺點

優點

    1、符合開閉原則,便於用新的實現去替換原有的實現;

    2、降低層與層之間的耦合度;

    3、便於後期的複用;

    4、標準化,看著舒服;

不足點

    1、降低了系統的效能;

    2、有時候會導致級聯修改;還拿上面的例子來說:若你想再向總經理傳達一件事情,可能還需要通過門衛也就是說UI層增加一些功能,BLL層和DAL層可能為了附和這個功能去新增相應的程式碼;


以上得出;在用三層架構的時候,合適的也是最好的,不要濫用。

C#版三層登入

                

Entity實體層

<span style="font-family:KaiTi_GB2312;font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Login.Model
{
    public class UserInfo
    {
        public int ID { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }
        public string Email { get; set; }
    }
}</span>

D層

<span style="font-family:KaiTi_GB2312;font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Login.DAL
{
    public class DbUtil
        //server是伺服器的名稱可以使Local,IP地址,計算機名稱;
        //DataBase是資料庫的名稱;
        //User ID是登入伺服器的使用者名稱;
        //Password是登入伺服器的密碼;
    {
        public static string ConnString = @"Server=ZLT;Database=Login;User ID=sa;Password=123";

        ////下面是用windows身份驗證模式連結資料庫的;
        //public static string ConnString = @"server=.;Database=Login;Integrated Security=ture";

    }
}</span>
<span style="font-family:KaiTi_GB2312;font-size:18px;">using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;

namespace Login.DAL
{
    public class UserDAO
    {
        public Login.Model.UserInfo  SelectUser(string userName,string password)
        {
            using (SqlConnection conn = new SqlConnection(DbUtil.ConnString)) //資料庫的連結;引用連結資料庫的字串
            {
                SqlCommand cmd = conn.CreateCommand();//定義命令語句
                
                cmd.CommandText = @"SELECT ID,UserName,Email
                                    FROM USERS WHERE UserName=@UserName AND Password=@Password";//SQL語句,查詢表USERS
                //cmd.CommandType = Commandtype.Text;
                cmd.CommandType = CommandType.Text;
                cmd.Parameters.Add(new SqlParameter("@UserName", userName)); //為引數USERNAME,PASSWORD賦值;
                cmd.Parameters.Add(new SqlParameter("@Password", password));

                conn.Open();//開啟資料庫;

                SqlDataReader reader = cmd.ExecuteReader(); //讀取資料;

                Login.Model.UserInfo user = null;
                while (reader.Read())
                {
                    if (user == null)
                    {
                        user = new Login.Model.UserInfo();
                    }

                    user.ID = reader.GetInt32(0);//給實體層屬性寫入資料;
                    user.UserName = reader.GetString(1);
                    user.Password = reader.GetString(2);
                    if (!reader .IsDBNull (2))
                    {
                        user.Email = reader.GetString(2);
                    }
                }

                return user;//將實體返回B層;


            }
        }
    }
}</span>

B層

<span style="font-family:KaiTi_GB2312;font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Login.BLL
{
    public class LoginManager
    {
        public Login.Model.UserInfo UserLogin(string userName, string password)
        {
            Login.DAL.UserDAO uDao = new Login.DAL.UserDAO();                //引用D層的UserDAO類  
            Login.Model.UserInfo user = uDao.SelectUser(userName, password);   //引用實體層的SelectUser方法  

            if (user != null)
            {
                return user;                  //將實體user返回到U層  
            }
            else
            {
                throw new Exception("登入失敗。");//給系統錯誤進行提示;
            
               
            }
        }  
    }
}
</span>

U層


<span style="font-family:KaiTi_GB2312;font-size:18px;">using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Login.UI;



namespace LoginUI
{
    public partial class 系統登入 : Form
    {
        public 系統登入()
        {
            InitializeComponent();
        }
        
        private void btnLogin_Click(object sender, EventArgs e)
        {
            //LoginBLL. svr = new LoginBLL.LoginService();
            string userName = txtUserName.Text.Trim();//向實體層的屬性寫入資料
            string password = txtPassword.Text;
            Login.BLL.LoginManager manage = new Login.BLL.LoginManager();//引用實體層
            Login.Model.UserInfo user = manage.UserLogin(userName, password);//將UI層的使用者名稱和密碼通過B層傳到實體層;

            MessageBox.Show("登入使用者:" + userName);

          
        }
    }
}</span>

小結

    1、學會站在巨人的肩膀上,自己也不失自己的思想;
    2、多多動手去實踐,原來自己沒有想象中那麼笨。



感謝您的寶貴時間~~~







相關文章