七层登陆回顾总结

简介: 七层登陆回顾总结

首先


在写七层登录之前要先把它的包图画出来,通过图之间的关系决定后续在敲代码的时候引用关系,其实在写这个的时候自己也没有多少经验,只能从网上找别人写的来照猫画虎,不过最后还是把它们之间的关系理清了,后面的工作就是对各层之间实现功能然后引用就行了。


代码部分


UI层:主要用于收集用户输入的数据然后传给外观层,再由外观层传给B层进行相应的判断。


  public partial class frmLogin : Form
    {
        public frmLogin()
        {
            InitializeComponent();
        }
        private void btnLogin_Click(object sender, EventArgs e)
        {
            //判断输入不能为空
            if (txtUserName.Text.Trim() == "")
            {
                MessageBox.Show("请输入用户名!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
            if (txtPassword.Text == "")
            {
                MessageBox.Show("请输入密码!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
            try
            {
                //实例化一个用户实体user
                Entity.UserInfo user = new Entity.UserInfo();
                //接受控件传来的用户信息
                user.UserID = Convert.ToInt32 (txtUserName.Text.Trim());
                //接受控件传来的密码信息
                user.PassWord = txtPassword.Text;
                //实例化外观
                Facade.LoginFacade FLogin = new Facade.LoginFacade();
                //定义一个bool型的变量,用于查看接收是否查找成功
                Boolean flag = false;
                //调用外观的方法,返回给flag
                flag = FLogin.SelectUser(user);
                //判断是否登陆成功
                if (flag != false)
                {
                    MessageBox.Show("登录成功!");
                    this.Hide();
                    this.DialogResult = System.Windows.Forms.DialogResult.OK;
                    //实例化一个窗体
                    Form a = new Form();
                    a.Show();
                }
                else
                {
                    MessageBox.Show("用户名或密码错误!");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

Facade层:运用外观层的目的是降低U层和B层之间的耦合,U层和B层之间的联系只需要通过Facade层的接口就行了,U层无需知道B层内部有哪些方法。外观层接收U层传来的数据,然后调用B层的方法对信息进行验证。


  //外观层
    public class LoginFacade
    {
        //将数据User从UI层传入BLL层,提供返回值给flag
        public Boolean SelectUser(Entity.UserInfo user)
        {
            bool flag;
            //实例化一个B层
            BLL.LoginBLL userBLL = new BLL.LoginBLL();
            flag = userBLL.UserBLL(user);
            return flag;
        }
    }

BLL层:B层主要是进行逻辑判断的,调用工厂中的方法创建相应的接口。


  //业务逻辑层
    public class LoginBLL
    {
        //判断用户是否存在
        public bool UserBLL(Entity.UserInfo user)
        {
            //实例化工厂
            Factory.LoginFactory fact = new Factory.LoginFactory();
            //调用工厂中的方法,实例化一个实现接口的内部类,将反射结果赋个idal
            IDAL.LoginIDAL idal = fact.CreateUser();//登陆中,此时的idal反射的是dal中的loginDAL类
            //接受D层的返回值
            DataTable table = idal.SelectUser(user);
            bool flag;
            //返回数据表类型,如果行数=0,说明没有符合该账号密码的用户
            if (table.Rows.Count==0)
            {
                flag = false;
            }
            else
            {
                flag = true;
            }
            //返回数值
            return flag;
        }
    }

Factory层:通过配置文件和抽象工厂我们可以实现不更改代码,换一下配置文件中的value值就可以更换数据库了。Factory还需要完成的工作就是定义一个接口调用接口层,实现BLL层和DAL层之间的数据传递。

1. //工厂层
    public class LoginFactory
    {
        //接受来自配置文件的数据,明确工厂要链接那一层
        string StrDB = System.Configuration.ConfigurationManager.AppSettings["DB"];
        //应用反射来获取被调用的DAL层的具体操作类
        public IDAL.LoginIDAL CreateUser()
        {
            //明确具体操作类
            string className = StrDB + "." + "LoginDAL";
            //反射加工厂的应用-将在DAL层中用到的具体类反射到接口,说明那个类实现了这个接口
            return (IDAL.LoginIDAL)Assembly.Load(StrDB).CreateInstance(className);
        }
    }

IDAL层:接口层是用于定义一个统一的接口,解除B层和D层的耦合。

public interface LoginIDAL
    {
        //放置接口函数,判断要登陆的用户是否在数据表中存在
        DataTable SelectUser(Entity.UserInfo user);
        //DataTable Selectuser(UserInfo user);
    }

DAL层:实现接口层定义的接口。

 public  class LoginDAL:IDAL.LoginIDAL
    {
        public DataTable SelectUser(Entity.UserInfo user)
        {
            //实例化数据操作类,进行数据查询,并获取返回值
            SQLHelper sqlHelper = new SQLHelper();
            //选在要查询的数据类型,作为sqlCommand的参数
            SqlParameter[] sqlparams = { new SqlParameter("@UserName", user.UserID), new SqlParameter("@Password", user.PassWord)};
            //查询语句
            string sql = "select * from Users where UserName=@UserName AND Password=@Password";
            //将查询语句和要查询的数据传入sqlHelper类中进行查询操作
            DataTable table = sqlHelper.ExecuteQuery(sql, sqlparams, CommandType.Text);//CommandType.Text解释SQL文本命令的字符串
            return table;
        }
    }

SQLHelpers:可以建立在D层下,也可以单独成为一个类

 SQLHelper类封装了重复写的一些数据库连接的代码。封装后通过给方法传递参数来访问数据库。

  public  class SQLHelper
    {
        private SqlConnection conn = null;//定义数据连接操作
        private SqlCommand cmd = null;//指定能在数据库上执行的操作
        private SqlDataReader sdr = null;//定义一个读取数据流的变量,从数据库中读取
        public SQLHelper()
        {
            string connStr = ConfigurationManager .AppSettings  ["connStr"];//ConnStr配置文件中连接数据的关键字(字符串)
            conn = new SqlConnection(connStr);//实例化一个连接
        }
        //将连接的数据库打开
        private SqlConnection GetConn()
        {
            if (conn.State==ConnectionState.Closed)//如果连接状态为关闭,则打开
            {
                conn.Open();
            }
            return conn;
        }
        //只显示运行代码,SQLHelper类中的其他数据库操作省略
        public DataTable ExecuteQuery(string cmdText,SqlParameter[] paras,CommandType ct)
        {
            //实例化一个数据表
            DataTable dt = new DataTable();
            //实例化出一个数据操作
            cmd = new SqlCommand(cmdText, GetConn());//cmdText为传进来的SQL命令,GetConn为一个打开状态的数据库连接
            cmd.CommandType = ct;
            cmd.Parameters.AddRange(paras);//将要查询的数据放入查询语句中
            using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
            {
                //通过提供的sqlDataReadere,对表进行操作
                dt.Load(sdr);
            }
            return dt;
        }
    }

Entity层:主要是用来在各层中传递数据。

上面的包图把引用关系阐述的已经很明白,那么开始实践,同时与三层相同的提醒,注意命名是否一致。

 public class UserInfo
    {
        //定义用户ID属性
        private int userid;
        public int UserID
        {
            get { return userid; }
            set { userid = value; }
        }
        //定义用户密码PassWord属性
        private string password;
        public string PassWord
        {
            get { return password; }
            set { password = value; }
        }
    }
相关文章
|
3月前
|
Web App开发 XML 缓存
《吐血整理》保姆级系列教程-玩转Fiddler抓包教程(4)-会话面板和HTTP会话数据操作详解
【7月更文挑战第19天】Fiddler会话面板概览:Fiddler的会话列表显示HTTP请求的详细信息,包括ID、状态码、协议、主机名、URL、内容类型、大小、进程及自定义备注。颜色和图标标识状态,如红色表示错误,黄色为认证,蓝色是HTML响应。用户可右键列进行搜索、标记重复、隐藏或自定义列,如添加请求方法。通过界面或脚本可添加自定义列,如显示ServerIP。会话还可复制和保存,解决乱码问题需解码响应体。
63 0
《吐血整理》保姆级系列教程-玩转Fiddler抓包教程(4)-会话面板和HTTP会话数据操作详解
|
数据库
七层登陆——内有详细注释
七层登陆——内有详细注释
机房重构七层登录遇到的BUG
机房重构七层登录遇到的BUG
53 0
|
数据库
【机房重构】七层
【机房重构】七层
|
设计模式 数据库连接
|
缓存 负载均衡 监控
开发必备知识:通过网站架构演进与计算机网络模型深入理解“网关”、“正向代理”、“反向代理”含义
反向代理与网关都是从网站架构中发展而来的产物,原来在Web1.0与Web2.0时代,一般都用反向代理,采用前置反向代理来完成反向路由、负载均衡、日志监控、缓存、兼容熔断等功能,常见的就是Nginx等等,反向代理一般采用静态配置,是因为Web时代中网站更新换代是不快的。
开发必备知识:通过网站架构演进与计算机网络模型深入理解“网关”、“正向代理”、“反向代理”含义
|
负载均衡 算法 数据库
从银行柜台小姐姐聊负载均衡中的会话粘滞
从银行柜台小姐姐聊负载均衡中的会话粘滞
134 0
|
安全 网络安全
分分钟教你学会云防火墙网络抓包
本文主要介绍如何创建网络抓包任务。您可通过网络抓包功能分析目标发送数据包的安全性,从而识别出网络通信的安全风险。
分分钟教你学会云防火墙网络抓包