前言

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

三层

简单来说,三层有别于之前有VB敲的小例子的是,三层非常好的解除了各个层之间的耦合,为以后的维护提供了极大的便利。

各个层之间的关系

U层:用户接触的层,准确来说,用户仅仅接触了一个U层。用于收集用户输入的信息以及用户的操作。
B层:根据U层用户输入的信息及操作和D层数据返回的信息,进行逻辑判断。
D层:连接数据库,接受B层消息,将用户需要的数据从数据库提取出来,返回到B层进行逻辑判断。

它们之间的引用关系为:U层引用B层,B层引用D层,各个层都引用实体层。用丹姐的包图来美化一下:

代码

U层

UI层很简单,就是将用户的操作传给B层。

namespace UI
{public partial class Login : Form{public Login(){InitializeComponent();}private void btnOk_Click(object sender, EventArgs e){string UserID = txtUserID.Text.Trim();//赋值string PassWord = txtPassWord.Text;string msg;//定义变量msg = "";//Model.Gobal.user  = txtUserID.Text;BLL.LoginManager Agr = new BLL.LoginManager();//实例化B层#region//验证是否为空bool ey = Agr.Empty(UserID, PassWord);if (ey == false) { MessageBox.Show("请填写完整信息。"); return; }#endregion#region//登录Model.UserInfo User = Agr.UserLogin(UserID, PassWord,out msg);MessageBox.Show(msg);if (msg=="登录成功。"){ Model.Gobal.level = User.Level;#endregion机房收费系统 jf = new 机房收费系统();机房收费系统.isRunMain = true;jf.Show();this.Close();}else{txtUserID.Text = "";txtPassWord.Text = "";txtUserID.Focus();}}private void btnCancel_Click(object sender, EventArgs e){this.Close();}
}

B层

BLL层相对复杂一点,就是将U层传来的参数或D层返回的值进行逻辑判断,给出正确的操作。

namespace BLL
{public class LoginManager{public Model.UserInfo UserLogin(string UserID,string PassWord,out string msg){DAL.UserDAO uDao = new DAL.UserDAO();//引用D层的UserDAO类Model.UserInfo User = uDao.SelectUser(UserID, PassWord);//引用实体层的SelectUser方法if(User!=null){//return User;//将实体user返回到U层msg = "登录成功。";}else{//throw new Exception("登录失败。");msg="登录失败。";//在这如果用上面这个注释掉的语句的话,输入正确用户名密码没有关系,如果输入错误的很弹出一个非常不友好的错误提示,这在我的C#机房登录问题中有总结。}return User;}public bool Empty(string UserID,string PassWord)//这就是验证框是是否为空的代码,我是在B层判断完返回一个bool给U层的。{if (UserID == "" || PassWord == "") { return false; }else { return true; }}}
}

D层

DAL层主要用到的就是连接数据库,让后对数据库中的数据进行一些简单的操作后返回给B层。对于B层引用的那个DbUtil.ConnString是在D层另外一个类里面定义的

namespace DAL
{class DbUtil{public static string ConnString = @"Server=XX;Database=你的数据库名字;User ID=**;Password=***";//链接数据库的字符串}
}

接下来是D层

namespace DAL
{public class UserDAO{public Model.UserInfo SelectUser(string UserID, string PassWord)//声明引用了Model层的userInfo类的SelectUser方法{using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))//引用连接数据库的字符串,连接数据库{SqlCommand cmd = conn.CreateCommand();//定义命令语句cmd.CommandText = @"SELECT * FROM T_USERS WHERE UserID=@UserID AND PassWord=@PassWord";cmd.CommandType = CommandType.Text;cmd.Parameters.Add(new SqlParameter("@UserID", UserID)); //为参数@UserID赋值cmd.Parameters.Add(new SqlParameter("@PassWord", PassWord)); //为参数@PassWord赋值conn.Open();//打开数据库连接SqlDataReader Reader = cmd.ExecuteReader();Model.UserInfo User = null;while (Reader.Read()){if (User == null){User = new Model.UserInfo();}User.UserID = Reader.GetString(0);//给实体层的属性写入数据User.PassWord = Reader.GetString(1);User.Level = Reader.GetString(2);User.Status = Reader.GetInt16(3);User.Head = Reader.GetString(4);}return User;//将实体user返回到B层}}}
}

实体层

实体层主要用于在三个层中传递实体,比如该版登录返回的类型就是实体。实体没什么好说的,用到哪个参数就在实体中创建就行,需要注意的就是实体类里面是直接对应到数据库表的,你定义的数据类型要和表中类型相一致才行。

namespace Model
{public class UserInfo{public string UserID { get; set; }public string PassWord { get; set; }public string Level { get; set; }public Int16 Status { get; set; }public string Head { get; set; }}
}

总结

三层的登录和七层的登录,对比VB敲的一层机房收费系统,其实就是把类与类之间的耦合一步步变小,达到一个相对完美,符合对扩展开放,对修改关闭的原则的过程,无非就是写代码的时候看似麻烦了一点,明明可以U层直接从数据库访问数据的却非要经过那么多层,传递那么多参数,但是这在以后的维护中起到了决定性的作用。站在一个高处去看七层,其实就是把以前的一步到位,转换成参数一步步传下去的过程。

不管是VB机房,三层机房,还是七层机房,刚开始都觉得很难,后来理清楚一条线就简单了,一气呵成,现在敲七层,觉得根本不是人脑子能想出来的东西,回头看看三层,在看看VB版,它们是我一步步由难到易过来的,克服了重重困难,我相信我的七层也会在我的努力下变得简单。

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

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

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

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

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

  3. 【机房重构】一步一步往上爬——不仅仅是三层

    不知道大家还记不记得之前学习的UML中一个单独列出来的一种图,也就是这次我想说的包图.那个时候,让我们画机房收费系统的各种图,用例图.类图等等,通过自己反复琢磨,还都勉勉强强画出来了.唯独只有包图,我 ...

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

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

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

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

  6. 三层登录VB.NET实现

    三层登录VB.NET实现 用C#实现了一遍三层登录,然后再使用VB.NET实现,然后转为七层登录,七层登录成功后,直接开始机房的VB.NET个人重构. 具体的过程省略了,直接上代码: 界面层 Impo ...

  7. 机房重构之--数据库设计说明书

    前言:机房重构,需要按照三层架构的理念来设计程序,需要重新设计数据库,而数据库设计说明书则是数据库设计的依据. 现摘录部分数据库设计说明书内容如下: 1.数据库总表: 表名 名称 描述信息 状态 基本 ...

  8. 机房重构(个人版)——类图

    我觉得机房重构的正确顺序是:数据库.绘图(包图.类图.时序图).文档最后是代码的实现.只是,尽管我这么觉得,却没有全然依照这个进行.我觉得.计划和顺序是死的.人是活的.假设进行到某一步.你进行不下去了 ...

  9. 配置文件总结(机房重构知识点总结)

    在这次机房重构中,第一次用了配置文件,把数据库的链接字串放在了配置文件中.和VB6.0版相比.不用又一次编译软件,就可以实现数据库的变更,确实方便了非常多. 直到想要总结配置文件才发现,自己对配置文件 ...

最新文章

  1. mybatis常见错误
  2. 下载ssl证书并安装后如何导出备份
  3. c语言汽水瓶换汽水的编程题,c语言:2种方法编程及优化;喝汽水问题
  4. Vue的v-for中列表项拖拽排序详细方法
  5. 跟技术大咖涨姿势!前沿CV技术+落地应用练就CV界的最强王者
  6. 【阿里云 MVP 月度分享】宋亚奇——应用MaxCompute实现电力设备监测数据的批量特征分析...
  7. 全球服务器内存芯片市场规模,2020年全球存储芯片行业市场现状分析,中国是全球最主要的消费国「图」...
  8. Centos yum 安装JDK及配置环境变量
  9. 计算机文件自动备份到移动硬盘,如何让电脑文件自动备份到指定的邮箱里?或者备份到指定的磁盘里...
  10. matlab ode45三体问题,“毕达哥拉斯3Body Proxblem”ODE解算器测试的下一步
  11. java list类_java_List集合及其实现类
  12. C++---模板特化
  13. 《JavaScript面向对象精要》——1.2 原始类型
  14. WebGIS设计思想
  15. 数据分析基本思路及手法
  16. IOS 拉伸图片(封装)
  17. zookeeper 客户端 zkCli.sh 的使用 查看节点
  18. 2018年蓝桥杯C++省赛B组【G:螺旋折线】 【思维】
  19. 叉积 微分 恒等式_一个斜三角中的恒等式
  20. 计算机无法完成评估,window_Windows Vista下系统评分无法完成的问题,不知道大家有没有遇到过这样 - phpStudy...

热门文章

  1. 前端面试题知识点总结(仅供参考)
  2. 15位院士出席 | 第六届中国(西安)国际3D打印大会会议日程
  3. 心理学的166个现象---之三
  4. ip地址 子网掩码 默认网关
  5. javascript 函数的回调和递归
  6. Java工具 :SQL解析
  7. gather torch_gather函数
  8. 师太你就从了老衲吧——完整版本
  9. 天津计算机应用基础,计算机应用基础考试大纲-天津教育招生考试院.DOC
  10. 分享一个好用的直播系统软件(一)