欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

个人机房重构--七层实现登录

发布时间:2025/3/21 编程问答 48 豆豆
生活随笔 收集整理的这篇文章主要介绍了 个人机房重构--七层实现登录 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

一、概述:

现在准备开始个人机房重构,那么就从简单的来,先用七层实现登录。我们常说的七层是指哪七层呢?其实七层就是在三层的基础上,添加了外观层——设计模式的外观模式,抽象工厂加反射,接口层。外观层主要是把UI层和BLL层分离;抽象工厂加反射主要是为了更换数据库的方便性,同时把DAL层中的类转换成IDAL层中的接口,从而使BLL层通过调用IDAL从而实现调用DAL层;接口层主要是为了把BLL层和DAL层分离;最终目的就是解耦。

二、关系:

 

三、代码:

UI层:界面层引用了实体层、外观层。主要用于接收用户输入的数据然后传给外观层,再由外观层传给B层进行相应的判断。

private void btnLogin_Click(object sender, EventArgs e){if (txtUserID.Text.Trim() == ""){MessageBox.Show("用户名不能为空", "温馨提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);}if (txtPWD.Text == ""){MessageBox.Show("密码不能为空", "温馨提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);}try{Facade.LoginFacade Facade = new Facade.LoginFacade();Entity.UserInfo user = new Entity.UserInfo();user.UserID = Convert.ToInt32(txtUserID.Text.Trim());user.Password = txtPWD.Text;Boolean flag = false;Facade.LoginFacade FLogin = new Facade.LoginFacade();//实例化外观flag = FLogin.SelectUser(user);//调用外观的方法,返回给userif (flag != false){this.Hide();this.DialogResult = System.Windows.Forms.DialogResult.OK;FrmMain frmMain = new FrmMain();//实例化一个窗体frmMain.Show();//显示实例化的窗体}else{MessageBox.Show("密码或者用户名错误");}}catch (Exception){throw;}}

Entity层:实体层是被引用的,不引用其他层。和三层中的实体层一样,主要是用来在各层中传递数据。

public class UserInfo{//定义 用户ID private int userid;public int UserID {get { return userid; }set { userid = value; }}//定义 用户名 private string userName;public string UserName{get { return userName; }set { userName = value; }}//定义 密码 private string password;public string Password{get { return password; }set { password = value; }}//定义 等级 private string level;public string Level{get { return level; }set { level = value; }}//定义 状态private bool state;public bool State{get { return state; }set { state = value; }}}

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

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

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

public class LoginBLL{public bool UserBLL(Entity.UserInfo UserInfo){Factory.LoginFactory fact = new Factory.LoginFactory();//实例化工厂IDAL.LoginIDAL idal = fact.CreateUser();//调用工厂方法创建接口 DataTable table = idal.selectUser(UserInfo);//接受D层的返回值 bool flag;if (table.Rows.Count == 0)//返回的DataTable类型,如果它的行数等于0,说明没有符合该帐号密码的用户 { flag = false; }else{flag = true;}return flag;}}

IDAL层:引用了实体层。(注意这里的IDAL添加的是接口,而不是类库;先添加类库,再把class改成interface,是无效的。)接口层是用于定义一个统一的接口,解除B层和D层的耦合。

public interface LoginIDAL{DataTable selectUser(Entity.UserInfo UserInfo);}

DAL层:引用了实体层、接口层。

public class LoginDAL : LoginIDAL{public DataTable selectUser(Entity.UserInfo UserInfo){SQLHelper sqlHelper = new SQLHelper();SqlParameter[] sqlParams = { new SqlParameter("@userID", UserInfo.UserID), new SqlParameter("@Password", UserInfo.Password) };string sql = @"SELECT * FROM [User_Info] WHERE UserID=@UserID and PWD =@Password";DataTable table = sqlHelper.ExecuteQuery(sql, sqlParams, CommandType.Text);return table;}}

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

public class LoginFactory{string StrDB = System.Configuration.ConfigurationManager.AppSettings["DB"];public IDAL.LoginIDAL CreateUser(){string ClassName = StrDB + "." + "LoginDAL";//DAL层的类名return (IDAL.LoginIDAL)Assembly.Load(StrDB).CreateInstance(ClassName);}}

SQLHelper:它是从DAL层分离出来的,定义了数据库的连接和一些SQL语句。将D层中需要重复使用的连接数据库代码抽象到一个层里面了,这样就不用重复的写这些代码了,减少了冗余。

public class SQLHelper{private SqlConnection conn = null;private SqlCommand cmd = null;private SqlDataReader sdr = null;public SQLHelper(){string connStr = ConfigurationManager.AppSettings["connstr"];//连接数据库,connstr是从web.config配置文件里面连接数据库的关键字,在每个.cs页面引用这一句就可以连接数据库conn = new SqlConnection(connStr);}private SqlConnection GetConn(){if (conn.State == ConnectionState.Closed){conn.Open();}return conn;}/// <summary>/// 执行不带参数的的增删改SQL语句或者存储过程/// </summary>/// <param name="cmdText">增删改查SQL</param>/// <param name="ct">命令类型</param>/// <returns>返回受影响的行数</returns> public int ExecuteNonQuery(string cmdText, CommandType ct){int res;try{cmd = new SqlCommand(cmdText, GetConn());cmd.CommandType = ct;res = cmd.ExecuteNonQuery();}catch (Exception ex){throw ex;}finally{if (conn.State == ConnectionState.Open){conn.Close();}}return res;}/// <summary>/// 执行带参数的的增删改SQL语句或者存储过程/// </summary>/// <param name="cmdText">增删改查SQL</param>/// <param name="paras">要查询的参数</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.AddRange(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;}}

最后还有很重要的配置文件:

<configuration><startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" /></startup><appSettings><add key ="ConnStr" value="server=SWX101; database=Computer;user ID = sa ; pwd=123456"/><!-- server是自己数据库的名字或者用.代表本地;把database,uid,pwd修改为与自己数据库对应的关系--><add key ="DB" value="DAL" /></appSettings> </configuration>

 

总结

以上是生活随笔为你收集整理的个人机房重构--七层实现登录的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。