C#机房重构三层登陆与设计模式结合

举报
ksh1998 发表于 2021/12/25 22:38:25 2021/12/25
【摘要】 前言: 七层登录一开始就没有弄清楚UI层和BLL层具体的职责,所以导致在机房重构的时候把登录的代码逻辑全部都写到了UI层。庆幸的是发现的早,在刚敲完登录就发现了。没有在完成整个重构再发现,哪个时候改代码可...

前言:
七层登录一开始就没有弄清楚UI层和BLL层具体的职责,所以导致在机房重构的时候把登录的代码逻辑全部都写到了UI层。庆幸的是发现的早,在刚敲完登录就发现了。没有在完成整个重构再发现,哪个时候改代码可就废了劲了。
好了废话不多说,下面具体介绍七层都是那些和具体每一层的职责!

七层结构:
在这里插入图片描述
职责:
LoginBLL(业务逻辑层,实现业务逻辑)
loginDAL(数据访问层,实现数据操作)
loginEnitity(实体层,负责在每层之间传递数据)
loginFacade(外观层,负责统一BLL层的功能,和向BLL层传递数据)
loginFactroy(工厂层,负责创建DAL层具体的查询类)
loginIDAL(接口层,定义一个具体的功能接口。让DAL层实现这个具体的功能)
loginUI(界面层,负责接收用户输入和显示数据!)
七层之间的关系:
在这里插入图片描述
从这个关系图中可以明确的看到,每层之间的一个引用关系。还有DAL层是去实现接口层的功能。
代码实现:
LoginEnitity:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LoginEnitity
{
    /// <summary>
    /// 实体层
    /// </summary>
    public class UserInfo
    {
        //定义用户UserName属性
        public string UserName { get; set; }
        //定义用户UserPwd属性
        public string UserPwd { get; set; }
        //定义用户等级
        public string UserLeve { get; set; }

        
    }
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

LoginUI:

 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 LoginEnitity;
using LoginFacade;

namespace LoginUI
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }   

        private void button1_Click(object sender, EventArgs e)
        {
            //判断用户密码是否为空
            if (txtUserName.Text.Trim()=="")
            {
                MessageBox.Show("请输入你的用户名!","提示",MessageBoxButtons.OK,MessageBoxIcon.Warning);
            }
            if (txtUserPwd.Text== "")
            {
                MessageBox.Show("请输入你的密码!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }

            try
            {
                //实例化一个用户
                LoginEnitity.UserInfo user = new UserInfo();
                //接收信息
                user.UserName = txtUserName.Text;
                user.UserPwd = txtUserPwd.Text;
                int[] flag = new int[3];
                LoginFacade.LoginFacade Flogin = new LoginFacade.LoginFacade();
                flag = Flogin.SelectUser(user);
                //调用显示窗体方法
                WorkLogin workLoing = new WorkLogin();
                workLoing.workLogin(flag);
                this.Hide();//隐藏本窗体
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                
            }
            
        }
    }
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63

LoginFacade:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LoginBLL;
using LoginEnitity;
using System.Data;
namespace LoginFacade
{
    /// <summary>
    /// 外观层
    /// </summary>
    public class LoginFacade
    {
        /// <summary>
        /// 判断用户是否存在
        /// </summary>
        /// <param name="user">用户</param>
        /// <returns></returns>
        public int[] SelectUser(UserInfo user)
        {
            int[] flag=new int[3];
            LoginBLL.LoginBLL usrBLL = new LoginBLL.LoginBLL();
            flag = usrBLL.UserBLL(user);
            return flag;
        }
        
  
        
    }
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

LoginBLL:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LoginEnitity;
using LoginFactory;
using LoginIDAL;
using System.Data;
namespace LoginBLL
{
    /// <summary>
    /// 业务逻辑
    /// </summary>
    public class LoginBLL
    {
        /// <summary>
        /// 判断用户是否存在
        /// </summary>
        /// <param name="user">用户</param>
        /// <returns>返回是否存在</returns>
        public int[] UserBLL(UserInfo user)
        {
            //返回的值
            int[] flgeLog = new int[3];
            //实例化工厂
            LoginFactory.LoginFactory fact = new LoginFactory.LoginFactory();
            //调用工方法创建接口
            LoginIDAL.LoginIDAL idal = fact.CreateUser();
            //接收D层的返回值
            DataTable table = idal.SelectUser(user);
            bool flag;
            //返回数据表的类型,如果等于 0.
            //则是没有符合该账户密码的用户
            if (table.Rows.Count == 0)
            {
                flag = false;
            }
            else
            {

                flag = true;
            }//end if
            //判断用户是否存在,根据上面表里有没有内容的返回值判断!
            if (flag != false)
            {
                //存在
                flgeLog[0] = 1;
            }//end if
            return flgeLog;//返回数值,账号存不存在
        }

    }
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55

LoginFactory :

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LoginIDAL;
using System.Reflection;
using System.Configuration;
namespace LoginFactory
{
    /// <summary>
    /// 工厂层
    /// </summary>
    public class LoginFactory
    {
        //获取配置文件

        string StrDB = System.Configuration.ConfigurationManager.AppSettings["DB"];
        //应用反射获得DAL层操作
        public LoginIDAL.LoginIDAL CreateUser()
        {
             string ClassName = StrDB +"."+"LoginDal";
          //  string ClassName = "LoginDAL.LoginDal";
            return (LoginIDAL.LoginIDAL)Assembly.Load(StrDB).CreateInstance(ClassName);
        }
    }
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

LoginIDAL:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LoginEnitity;
//命名空间
using System.Data;
namespace LoginIDAL
{
    /// <summary>
    /// 接口层
    /// </summary>
    public interface LoginIDAL
    {
        //放置接口函数,判断要登录的用户是否在数据表中。
        DataTable SelectUser(UserInfo user);
    }
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

LoginDAL:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using LoginIDAL;
using LoginEnitity;
namespace LoginDAL
{
    /// <summary>
    /// 登录查询
    /// </summary>
    public class LoginDal:LoginIDAL.LoginIDAL
    {
       
        /// <summary>
        /// 实现接口
        /// </summary>
        /// <param name="user">用户</param>
        /// <returns>返回是否存在</returns>
        public DataTable SelectUser(UserInfo user)
        {
            //实例化数据操作类,进行数据查询,并获取返回值
            SQLHelper sqlHelper = new SQLHelper();
            //数据库表里的内容和实体的内容进行一一映射。
            SqlParameter[] sqlparms = {new SqlParameter("@UserName",user.UserName)};
            string sql = @"select * from [User_Info] where UserName=@UserName";
            //把查询的信息储存到临时表
            DataTable table = sqlHelper.ExecuteQuery(sql,sqlparms,CommandType.Text);
            return table;
        }
    }
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

SQLHerlper:
其实SQLHerper也可以算作一层,因为SQLHerper把在查询数据用到的相同功能都放到了一起。所以七层也好八层也好,重点还是要把代码做到。可复用,可扩展。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LoginEnitity;
using LoginIDAL;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
namespace LoginDAL
{
    //数据集访问层---数据操作类
 public   class SQLHelper
    {
        //定义数据库连接操作,指定在数据库上操作的类型,定义数据库读取操作
        private SqlConnection conn = null;//连接
        private SqlCommand cmd = null;//命令
        private SqlDataReader sdr = null;//数据集
        /// <summary>
        /// 数据库连接
        /// </summary>
        public SQLHelper()
        {
            string connStr = ConfigurationManager.AppSettings["connStr"];
            conn = new SqlConnection(connStr);
        }
        private SqlConnection GetConn()
        {
            //判断状态是否为空打开状态
            if (conn.State==ConnectionState.Closed)
            {
                conn.Open();//打开
            }//end if
            return conn;
        }
        /// <summary>
        /// 执行不带参数的数据库操作或储存过程
        /// </summary>
        /// <param name="cmdText">增删改查操作</param>
        /// <param name="ct">命令类型</param>
        /// <returns>返回受影响的行数</returns>
        public int ExecuteNonQuery(string cmdText,CommandType ct)
        {
            int res;
            cmd = new SqlCommand(cmdText, GetConn());
            cmd.CommandType = ct;
            res = cmd.ExecuteNonQuery();
            if (conn.State == ConnectionState.Open)
            {
                conn.Close();
            }

            return res;
        }
        /// <summary>
        /// 执行带参数的数据库操作或储存过程
        /// </summary>
        /// <param name="cmdText">增删改查操作</param>
        /// <param name="ct">命令类型</param>
        /// <returns>返回受影响的行数</returns>
        public int ExecuteNonQuery(string cmdText, SqlParameter[] paras ,CommandType ct)
        {
            int res;
            using (cmd = new SqlCommand(cmdText, GetConn()))
            {
                cmd.CommandType = ct;
                cmd.Parameters.Add(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;
        }
    }
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112

实现结果:
在这里插入图片描述

文章来源: kangshihang.blog.csdn.net,作者:康世行,版权归原作者所有,如需转载,请联系作者。

原文链接:kangshihang.blog.csdn.net/article/details/103504432

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。