前言

终于开始机房重构了,在此之前,我用三层敲了机房的部分功能,感觉还不错,现在真正到了七层,还是蛮紧张的。话不多说,开始机房的七层登录。

包图

我发现好多伙伴写七层登录的时候,都喜欢分析一下包图,那我也来简单分析一下吧。

包图展现的无非就是引用关系,U层引用外观,外观引用B层,B层通过工厂创建一个接口返回给B层,然后B层通过这个接口连接到实现接口的D层,完成数据的增删改查。接下来,我说几个很重要的层。

配置文件

通过配置文件可以很方便的更改数据库,如果需要更改数据库,我只需要把配置文件中的SqlDAL改成其他数据库名字就ok了。

<?xml version="1.0" encoding="utf-8" ?>
<configuration><appSettings><add key="ConnStr" value="server=.;database="数据库名字";User ID=**;password=******"/><add key="DB" value="SqlDAL"/></appSettings>
</configuration>

B层

B层我觉得是相对重要的一层,因为几乎所有的逻辑判断全在B层,这里是思维闪光的地方。

public bool UserBLL(Entity.UserInfo UserInfo)
{Factory.Factory fact = new Factory.Factory();//实例化工厂IDAL.IDAL 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;
}

工厂

工厂的作用就是将反射的接口返回给B层,供B层连接D层使用。

string StrDB = System.Configuration.ConfigurationManager.AppSettings["DB"];//接收来自配置文件的数据
public IDAL.IDAL CreateUser()
{string ClassName = StrDB + "." + "DAL";//DAL层的类名return (IDAL.IDAL)Assembly.Load(StrDB).CreateInstance(ClassName);//反射加工厂的应用
}

D层

D层的作用就是连接数据库,进行增删改查,然后将结果返回。

public DataTable selectUser(Entity.UserInfo UserInfo){   SqlParameter[] sqlParams = {new SqlParameter("@userID", UserInfo.UserID),new SqlParameter("@PassWord",UserInfo.PassWord)};string sql = @"SELECT * FROM [T_USERS] WHERE UserID=@UserID and PassWord =@PassWord";DataTable table =SqlDAL.SQLHelper.GetDataTable(sql, CommandType.Text, sqlParams);return table;}

SqlHelper

public static string ConnectionString = ConfigurationManager.AppSettings["ConnStr"];
/// <summary>
///执行带参数的查询方式,返回值为表。
/// <param name="cmdTxt" >参数cmdText为所要执行的sql语句</param >
/// <param name=" cmdType">查询时的查询方式</param>
/// <param name="paras" >查询时的命令参数</param>
/// <returns >查询后以表的形式返回,</returns >
/// </summary>
/// <remarks></remarks> 
public static DataTable GetDataTable(string cmdTxt, CommandType cmdType, SqlParameter[] paras)
{SqlConnection conn = new SqlConnection(ConnectionString);//创建数据库的连接  SqlCommand cmd = default(SqlCommand);//定义命名变量。DataSet adataset = null;//定义数据适配器,DataSet类表示一个存放于内存中的数据缓存  SqlDataAdapter adaptor = default(SqlDataAdapter);//SqlDataAdapter类目的是填充DataSet  cmd = new SqlCommand(cmdTxt, conn);//在conn上面执行实例化命令变量,并执行语句cmdtype  cmd.CommandType = cmdType;//命令执行的类型  cmd.Parameters.AddRange(paras);//命令执行的参数  adaptor = new SqlDataAdapter(cmd);//初始化 SqlDataAdapter 类的新实例,用指定的 cmd 作为 SelectCommand 的属性  adataset = new DataSet();try{if (conn.State == ConnectionState.Closed){conn.Open();}adaptor.Fill(adataset);//向adaptor对象中填充查询的数据  }catch (Exception ex){Interaction.MsgBox(ex.Message);}finally{if (conn.State == ConnectionState.Open){conn.Close();}}return adataset.Tables[0];//获取包含在 DataSet 中的表的集合。
}

这个是参考的一个师哥的博客,但是我发现这个SqlHelper不全,因为它每次访问数据库都会有一个返回值,而我如果要去更新表中的东西如修改密码时,它显然不是最好用的,所以我根据这个有返回值的SqlHelper,自己编写了一个没有返回值的SqlHelper。

public static bool ExecuteNonQuery(string cmdTxt, CommandType cmdType, SqlParameter[] paras)
{using (SqlConnection conn = new SqlConnection(ConnectionString)){    //创建数据库的连接  SqlCommand cmd = default(SqlCommand);//定义命名变量。为什么要用default?cmd = new SqlCommand(cmdTxt, conn);//在conn上面执行实例化命令变量,并执行语句cmdtype  cmd.CommandType = cmdType;//命令执行的类型  cmd.Parameters.AddRange(paras);//命令执行的参数conn.Open();int enq = cmd.ExecuteNonQuery();cmd.ExecuteNonQuery();bool flag;if (enq > 0) { flag = true; }else { flag = false; }return flag;}
}

总结

七层的代码相对于三层来说,我觉得多不了多少,但是它带来的便利是相当大的,外观模式在机房收费系统中的作用体现不大,但是反射+抽象工厂的应用,极大的方便了该系统更换数据库,只需要改一行代码,就能在完全不知道内部代码是什么的情况下完成数据库的更换,真正体现了“对修改关闭,对扩展开放”这句话。

【C#】七层登录机房重构相关推荐

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

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

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

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

  3. 七层登录之新小知识点

    在机房重构的时候,遇到了很多新的小知识点,初次接触,还没能灵活运用,摘出来概念性东西先来了解了解,之后再代码实现过程中希望能灵活运用! SqlHelper SqlHelper是一个基于.NET Fra ...

  4. 机房重构(C#)--七层登录(一)

    一.包图 二.引用关系 三.UI层 //**************************** //项目名称:UI //命名空间:UI //文件名: LoginUI //作者: 陈海明 //创建日期 ...

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 局部加权线性回归(Local Weighted Linear Regression)+局部加权回归+局部线性回归
  2. SQL语句书可以提高执行效率的5种需要注意的书写方法
  3. DOS批处理高级教程精选(四)
  4. GDI 和GDI+ 混合编程
  5. Android studio设置相机权限,如何强制将“android.permission.CAMERA”权限添加到Codename中的清单中...
  6. java 图文生成图片_java生成图片
  7. Windows 磁盘分区方法
  8. C语言中全局变量存放在哪个位置?
  9. 编译mod_jk.so
  10. python中astr是啥_python 基础 之 字符串
  11. File Cabinet Pro for Mac(菜单栏快捷文件管理软件)
  12. 网页后门危害大 网站安全狗帮助查杀
  13. GoTop给网站加一个悬挂猫效果上吊猫
  14. 百度面试题:求绝对值最小的数
  15. envi栅格图像镶嵌_影像镶嵌(基于像素的图像镶嵌)
  16. CSS基础教程(下)
  17. 华为视频会议终端8000、9000系列取名有什么含义?
  18. Arduino/stm32 智能小车设计(一)
  19. 给计算机老师的元旦祝福,送给老师的元旦祝福语
  20. 使用JDBC操作数据库的六部曲

热门文章

  1. C语言训练-阶乘和数
  2. PC端微信 机器人智能自动回复实现 全攻略
  3. Android 设备清理内存 RAM
  4. 常用SQL语句(笔记)
  5. 关于中大型项目的组织分工问题
  6. 第22回 多线程是干什么滴!
  7. 【软件工程师日语】06.邮件(3)
  8. 易语言基于飞浆的本地ocr文字识别 xp win7 win10 无网离线 都可用
  9. crm使用soap操作商机
  10. Vuex---在 Vue 组件中获得 Vuex 状态state