一、概述:

现在准备开始个人机房重构,那么就从简单的来,先用七层实现登录。我们常说的七层是指哪七层呢?其实七层就是在三层的基础上,添加了外观层——设计模式的外观模式,抽象工厂加反射,接口层。外观层主要是把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>

个人机房重构--七层实现登录相关推荐

  1. 【C#】机房重构——七层登录

    前言: 两个多星期的探索终于算是把登录敲通了,当"登录成功!"显示在我眼前的那一刻,我想那种快乐的感觉就好像我中了三百万大奖一样的激动吧! 三层当时不是很明白,所以三层到七层走了不 ...

  2. 【C#实践】详解三层转七层:登录

    背景 一开始借用别人的代码,敲完也是很多地方看不懂!不知道从什么地方下手!不懂三层到七层到底是怎么映射过去的! 后来就是多查,慢慢有大体的轮廓,逐个部分解决! 过程: 1.看整体,对于不懂的部分,先查 ...

  3. 机房重构之权限判断登录窗体

    首先是分为七层: 实体层:Enitity 数据访问层:DAL 连接DAL的接口层:IDAL 业务逻辑处理层:BLL 连接BLL的接口处:IBLL 通过反射连接BLL,DAL,UI的抽象工厂层:Fact ...

  4. 【C#】七层登录机房重构

    前言 终于开始机房重构了,在此之前,我用三层敲了机房的部分功能,感觉还不错,现在真正到了七层,还是蛮紧张的.话不多说,开始机房的七层登录. 包图 我发现好多伙伴写七层登录的时候,都喜欢分析一下包图,那 ...

  5. 【C#】三层登录机房重构

    前言 光总结了C#三层登录出现的问题,还没有真正总结过三层登录实例,近来敲机房的七层登录,可谓是问题重重,当初自以为三层理解的很透彻了,现在看来还差的很多,我需要用总结来沉淀一下自己,让自己的心不那么 ...

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

    前言: 七层登录一开始就没有弄清楚UI层和BLL层具体的职责,所以导致在机房重构的时候把登录的代码逻辑全部都写到了UI层.庆幸的是发现的早,在刚敲完登录就发现了.没有在完成整个重构再发现,哪个时候改代 ...

  7. 机房重构前奏——三层转七层

    刚敲完三层的小例子之后,感觉还是很简单的,只是通过分层让不同的层次完成不同的工作,减少耦合性.可是接下来师父就直接给了一个大难题,让我将三层转变为七层,这对我来说相当困难,自己当时根本就不知道有哪几层 ...

  8. C#七层架构 ----【登录】

    学习完三层之后对于三层有了大概的了解,结束了三层的学习便带着好奇来到了机房重构的学习当中. 在机房重构中第一问题就是要做"登录功能",这个登录功能用到了七层的架构. 今天我们就来学 ...

  9. 【机房收费个人版】七层登陆

    敲完七层登陆之后,让我认识到所谓的七层就是在三层的基础上添加了两个模式和一个SqlHelper.外观模式完美的体现了依赖倒转原则和迪米特法则的思想,降低了耦合性:反射+配置文件+抽象工厂模式,用于实现 ...

最新文章

  1. c/c++中的函数指针和指针函数
  2. 1.7 单层卷积网络-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
  3. vim编辑器的常用技巧
  4. 面向对象 - 1.面向过程/2.面向对象/3.如何使用类/4.__init__方法/5.属性查找/6.补充知识/7.可扩展性高...
  5. JAVAOOP期末试题
  6. TransmittableThreadLocal
  7. 苏州大学计算机学院推免流程,【图片】18年苏州大学计算机872考研经验分享【苏州大学研究生吧】_百度贴吧...
  8. java俄罗斯方块代码_[转载]java编写的一个俄罗斯方块(源代码)
  9. oracle exadata维保,EXADATA数据一体机巡检说明
  10. 低压差线性稳压电源(LDO)原理、参数及应用
  11. 智能家居小知识普及篇——智能家居技术有哪些劣势
  12. Windows字符和字符串处理
  13. 第二章课后习题 华氏温度与摄氏温度的java简单转换
  14. XSS原理dvwaxssvalidator使用
  15. MVCC如何实现数据库读已提交和可重复读这两种隔离级别?
  16. linux pg启动日志查看,pg日志分析
  17. 重量级锁和轻量级锁(自旋锁)
  18. linux用命令下载图片,巧用linux命令做图片下载器
  19. 数据结构之链表 - 动图演示
  20. 突出计算机学院的比赛名,学院在2019年全国大学生信息安全竞赛安徽省赛中喜获佳绩...

热门文章

  1. 探索 Python、机器学习和 NLTK 库 开发一个应用程序,使用 Python、NLTK 和机器学习对 RSS 提要进行分类
  2. Netty系列(三):说说NioEventLoop
  3. rman备份恢复总结
  4. Arduino数字引脚作为GPIO的使用
  5. [实战]HM-Router configuration for TP ROOM
  6. javascript基础 (2)
  7. CentOS6.5下Nginx1.7.4安装记录
  8. Mongodb安装搭建Replica Set+Sharding集群
  9. C#文件路径操作总结
  10. SHE PWM的simulink仿真谐波分析