【前言】
早就听说七层登录这个名词了,今天自己终于也到这个项目了,在没动手做之前,我认为七层登录是一个项目,机房重构是后一个项目的...不要笑...做完之后闷了将近一天才明白过来,原来这已经是机房重构了,这是机房重构的第一步—登录(没接触之前先做的登录)。并且明白了其中的一些套路。这里就不详细说了,先来总结一下七层登录吧。
【内容】
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; }
}
总结:
只有做了才有发言权。不要给自己贴标签说自己不会,不做肯定不会。无论是机房重构还是别的什么项目,经过适当的思考之后就要动手去做,不然就会一拖再拖,越来越反感。给自己加油!希望在接下来的机房重构中越走越顺利,可以学到更多的技术性知识!