C#机房重构—七层登录

【前言】

 

早就听说七层登录这个名词了,今天自己终于也到这个项目了,在没动手做之前,我认为七层登录是一个项目,机房重构是后一个项目的...不要笑...做完之后闷了将近一天才明白过来,原来这已经是机房重构了,这是机房重构的第一步—登录(没接触之前先做的登录)。并且明白了其中的一些套路。这里就不详细说了,先来总结一下七层登录吧。

【内容】

1.七层介绍

(1)用户界面层(UI):是用户所能看的到的界面,用来接收和显示用户的请求,将参数传递给外观层。

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

(3)业务逻辑层(BLL):进行逻辑判断和计算。

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

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

(6)数据访问层(DAL):实现接口层定义的接口。

(7)实体层(Entity):和三层中的实体层一样,主要是用来各层中传递数据。

—SqlHelper:将D层中需要重复使用的连接数据库代码抽象到一个层里面,减少代码冗余。

2.七层架构关系图

3.七层架构引用关系

引用

UI层

Façade层、Entity层

Façade层

BLL层、Entity层

BLL层

Factory层、IDAL层、Entity层

Factory层

IDAL层

IDAL层

Entity层

DAL层

IDAL层、Entity层

Entity层

/

4.代码部分

(1)配置文件

<appSettings>
  <add key="DB" value ="DAL"/>
  <add key="connStr" value="Server=FRJ;Database=Login7; User ID=sa;Password=123"/>
</appSettings>

(2)UI层

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

    //实例化一个外观
    Facade.LoginFacade facade = new Facade.LoginFacade();

    //实例化一个用户
    Entity.UserInfo user = new Entity.UserInfo();

    //接收信息
    user.UserName = txtUserName.Text;
    user.Password = txtPassword.Text;

    //调用外观方法,返回给user
    Boolean flag = false;
    Facade.LoginFacade flogin = new Facade.LoginFacade();

    flag = flogin.SelectUser(user);

    //判断是否登录成功
    if (flag != false)
    {
        MessageBox.Show("登录成功");
        this.Hide();
        this.DialogResult = System.Windows.Forms.DialogResult.OK;

        //加判断权限(学生、操作员、管理员)
    }
    else
    {
        MessageBox.Show("用户名或密码不正确");
    }
}

(3)外观层(Facade)

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

(4)业务逻辑层(BLL)

//命名空间
using System.Data;

namespace BLL
{
    public class LoginBLL
    {
        //判断用户是否存在
        public bool UserBLL(Entity.UserInfo user)
        {
            //实例化工厂
            Factory.LoginFactory fact = new Factory.LoginFactory();

            //调用工厂方法创建接口
            IDAL.LoginIDAL idal = fact.CreateUser();

            //接收D层的返回值
            DataTable table = idal.SelectUser(user);

            bool flag;
            //返回数据表类型,如果行数=0,说明没有符合该账号密码的用户
            if (table.Rows.Count == 0)
            {
                flag = false;
            }
            else
            {
                flag = true;
            }
            return flag;
        }
    }
}

(5)工厂层(Factory)

//命名空间
using System.Reflection;
using System.Configuration;

namespace Factory
{
    public class LoginFactory
    {
        //获取配置文件
        string StrDB = System.Configuration.ConfigurationManager.AppSettings["DB"];

        //应用反射来获取DAL层操作
        public IDAL.LoginIDAL CreateUser()
        {
            string ClassName = StrDB + "." + "LoginDAL"; //程序集+类名
            return (IDAL.LoginIDAL)Assembly.Load(StrDB).CreateInstance(ClassName);
        }
    }
}

(6)接口层(IDAL)

//命名空间
using System.Data;

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

(7)数据访问层(DAL)

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

        //执行不带参数的数据库操作或存储过程
        public int ExcuteNonQuery(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;
        }

        //执行带参数的数据库操作或存储过程
        public int ExcuteNonQuery(string cmdText, SqlParameter[] paras, CommandType ct)
        {
            int res;
            using (cmd = new SqlCommand(cmdText, GetConn()))
            {
                cmd.CommandType = ct;
                cmd.Parameters.AddRange(paras);
                res = cmd.ExecuteNonQuery();
            }
            return res;
        }

        //执行不带参数的SQL查询语句或存储过程
        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;
        }

        //执行带参数的SQL查询语句或存储过程
        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;
        }
    }
}
LoginDAL

//命名空间
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using IDAL;
using Entity;

namespace DAL
{
    public class LoginDAL : IDAL.LoginIDAL
    {
        public DataTable SelectUser(Entity.UserInfo user)
        {
            //实例化数据操作类,进行数据查询,并获取返回值
            SqlHelper sqlHelper = new SqlHelper();
            SqlParameter[] sqlparams = { new SqlParameter("@UserName",user.UserName),
                                   new SqlParameter("@Password",user.Password)};
            string sql = @"SELECT * FROM [Users] WHERE UserName =@UserName AND Password = @Password";
            DataTable table = sqlHelper.ExecuteQuery(sql, sqlparams, CommandType.Text);
            return table;
        }
    }
}

(8)实体层(Entity)

public class UserInfo
{
    //定义用户ID属性
    public int UserID { get; set; }

    //定义用户名UserName属性
    public string UserName { get; set; }

    //定义密码Password属性
    public string Password { get; set; }
}

总结:

只有做了才有发言权。不要给自己贴标签说自己不会,不做肯定不会。无论是机房重构还是别的什么项目,经过适当的思考之后就要动手去做,不然就会一拖再拖,越来越反感。给自己加油!希望在接下来的机房重构中越走越顺利,可以学到更多的技术性知识!

评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值