背景

一开始借用别人的代码,敲完也是很多地方看不懂!不知道从什么地方下手!不懂三层到七层到底是怎么映射过去的!

后来就是多查,慢慢有大体的轮廓,逐个部分解决!

过程:

1.看整体,对于不懂的部分,先查个大概

2.把属于三层的部分分出来看,明白七层里面是怎么走的

3.搞明白工厂,外观是为什么加,怎么加上去的

外观模式:

工厂模式:

在七层中,一开始的初心的确是用抽象工厂+反射,因为不确定数据库的使用,所以需要写出个中工厂类

但后来实际分析,七层中用的并不是抽象工厂,而是简单工厂改进的抽象工厂

因为如果真的是抽象工厂,那为什么代码里没有IFactory的类呢?

其实它将抽象工厂类IFactory和具体的实现子类用一个单独的类来表示,也就是简单工厂,将原本抽象工厂中实例化不同的工厂的过程变成了在简单工厂中的选择

最后,而在简单工厂中有因为应用反射来代替简单工厂中的选择

所以,就不存在选择的部分,想用哪个数据库,直接改配置文件,实例的过程是依赖配置文件来实例化,修改配置文件,只需要该DAL里面具体实现接口的类

关于每一层具体的功能,其实对照着三层,就能够大致感觉出来

4.调试,解决运行过程中出现的问题

收获

敲七层看了很多博客,也回头了看自己的博客,最明显的感受,不管做什么都要一往无前!纯理论——转变——实际应用

一往无前,一直前进,前面没有东西能够阻挡,勇猛武威的前进
【反义词】畏葸不前,裹足不定,畏首畏尾                                                                         

越勇敢不怕,越是会发现 问题如此简单,多查,多反复,多实践总结

代码:

Entity层

namespace Entity
{public class UserInfo{private int? userid;      //定义字段 用户ID 字段private string userName;  //定义字段 用户名 字段private string password;  //定义字段 密码 字段private string level;     //定义字段 等级 字段public int? Userid { get => userid; set => userid = value; }        public string UserName { get => userName; set => userName = value; }public string Password { get => password; set => password = value; }        public string Level { get => level; set => level = value; }       }
}

DAL层

namespace DAL
{public class LoginDAL:IDAL.LoginIDAL   {public DataTable selectUser(Entity.UserInfo UserInfo)  //在内存中的一个数据表{           SqlHelper sqlHelper = new SqlHelper();string sql = @"SELECT * FROM [User_info] WHERE UserID= @userID and Pwd= @PassWord";SqlParameter[] sqlParams = { new SqlParameter("@userID", UserInfo.Userid), new SqlParameter("@PassWord", UserInfo.Password) };DataTable table = sqlHelper.ExecuteQuery(sql, sqlParams, CommandType.Text);return table;          }}
}

sqlHelp类前面博客中已经完成

IDAL层

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

Factory层

using System.Reflection;namespace Factory
{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);//反射+工厂的应用}}
}

BLL层

namespace BLL
{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){flag = false;}else{flag = true;}return flag;}}
}

Facade层

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

UI层

namespace UI
{public partial class UILogin : Form{public UILogin(){InitializeComponent();}private void butOk_Click(object sender, EventArgs e){if (txtUserID.Text.Trim() == ""){MessageBox.Show("用户名不能为空,请输入用户名", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);}if (txtPassword.Text == ""){MessageBox.Show("密码不能为空,请输入密码", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);}//try//{Entity.UserInfo user = new Entity.UserInfo();user.Userid = Convert.ToInt32(txtUserID.Text.Trim());user.Password = txtPassword.Text;Boolean flag = false;Facade.LoginFacade FLogin = new Facade.LoginFacade(); //实例化外观flag = FLogin.SelectUser(user);//调用外观方法,返回给userif (flag!=false){MessageBox.Show("登录成功");this.Hide();//隐藏当前窗体this.DialogResult = System.Windows.Forms.DialogResult.OK;frmMain frmMain = new frmMain();//实例化一个窗体frmMain.Show();}else{MessageBox.Show("密码或用户名错误");}//}//catch (Exception)//{//    throw;//}}private void butCancel_Click(object sender, EventArgs e){System.Environment.Exit(0);//这是最彻底的退出方式,不管什么线程都能被强制退出//this.Close();//只是关闭当前窗口,若不是主窗体的话,是无法退出程序的,另外,若有托管线程(非主线程),也无法干净退出//Application.Exit();//强制所有消息终止,退出所有的窗体,但是若有托管线程(非主线程),也是无法干净退出的;//Application.ExitThread();//强制终止调用线程上的所有消息,同样面临其他线程无法正确退出的难题}}
}

【C#实践】详解三层转七层:登录相关推荐

  1. 网络流量分析详解(包含OSI七层模型、TCP协议及Wireshark工具用法)

    网络流量分析 Network Traffic Analysis(NTA) 这个系列讲的是整个网络流量分析流程,其中包含TCP协议.HTTP协议详解和Wireshark.Tcpdump的详细用法,现在只 ...

  2. 负载均衡原理与实践详解 第三篇 服务器负载均衡的基本概念-网络基础

    负载均衡原理与实践详解 第三篇 服务器负载均衡的基本概念-网络基础 系列文章: 负载均衡详解第一篇:负载均衡的需求 负载均衡详解第二篇:服务器负载均衡的基本概念-网络基础 负载均衡详解第三篇:服务器负 ...

  3. Keras LSTM实现多维输入输出时序预测实践详解

    自古以来,我们就希望预知未来,现如今,随着大数据人工智能技术的发展,我们早已经不满足传统的同比.环比等数据分析方法,但是时间序列趋势预测的传统算法又很专业,很难用于日常生产经营中. 深度学习神经网络为 ...

  4. 负载均衡原理与实践详解 第五篇 负载均衡时数据包流程详解

    负载均衡原理与实践详解 第五篇 负载均衡时数据包流程详解 系列文章: 负载均衡详解第一篇:负载均衡的需求 负载均衡详解第二篇:服务器负载均衡的基本概念-网络基础 负载均衡详解第三篇:服务器负载均衡的基 ...

  5. 计算机辅助药物设计的一般原理,朱瑞新着--_计算机辅助药物设计(Ⅰ)--基本方法原理概要与实践详解.pdf...

    文档介绍: 计算机辅助药物设计 ------ 基本方法原理概要与实践详解作者朱瑞新 2011 年 1 月目录序前言第一章"计算机辅助药物设计"与 M OE 概貌一.导言二.&quo ...

  6. AlexNet网络结构详解(含各层维度大小计算过程)与PyTorch实现

    AlexNet网络结构详解(含各层维度大小计算过程)与PyTorch实现 1.AlexNet之前的思考 2.AlexNet网络结构 3.AlexNet网络结构的主要贡献 4.PyTorch实现     ...

  7. centos 安装mysql5.7_Zabbix 4.2.5 安装部署实践详解

    [导读]云计算背景下,无论是大数据.物联网还是边缘计算,规模化后大量的设备需要保证正常运行,在人员一定的情况下,就需要提高运行维护效率.同时随着智能化被应用在人们生活的方方面面,关联性也越来越紧密,即 ...

  8. 组件化实践详解(二)

    在上一篇文章<组件化实践详解(一)>中我们介绍了组件化实践的目标和实践步骤,本文继续说说关于组件化实践遇到的问题及思考. 1.组件内的架构设计 这条本来我是不想写的,但是很多组件化的文章里 ...

  9. ios无痕埋点_移动端无痕埋点实践详解(二)

    0x01 前言 在移动端无痕埋点实践详解(一)这篇文章大致总结了移动端无痕埋点的基本原理.主要介绍了什么是无痕埋点,无痕埋点的基础数据流程以及在Android系统上总体思路.这篇文章着重总结下无痕埋点 ...

最新文章

  1. HDU3434数学题
  2. 一文看尽各种 NLP 任务
  3. oracle之数据同步:Oracle Sql Loader使用说明(大批量快速插入数据库记录)
  4. DataNode启动后自动停止的问题( Incompatible clusterIDs in /xxx/xxx;namenode clusterID = xxxx;datanode clusterI)
  5. 邮件服务器之POP3协议分析
  6. LeetCode 1108. IP 地址无效化
  7. 基于内容的图像检索系统(合集)
  8. 人人都可以用Mac--安装和卸载应用软件
  9. matlab选择语句函数,Matlab基本语句和基本函数
  10. 《数据挖掘导论》绪论
  11. 研旭至尊板——F28335知识点总结①
  12. 安卓版无线投屏服务器,无线乐播app最新版安卓版
  13. win10远程桌面连接记录
  14. eclipse 装阿里规范模板
  15. 2022AcWing寒假算法每日一题之1934. 贝茜放慢脚步
  16. 万豪国际集团贵州首家万枫酒店在贵阳会展中心开业
  17. 用VBA代码下载网络上的文件
  18. _stdcall是什么?
  19. tf.layers.flatten()使用
  20. java 设置全局变量

热门文章

  1. 伦理困境:人工智能浪潮与“AI威胁论”之争
  2. 2022-2028年中国塑料编织品的制造行业市场竞争态势及投资方向分析报告
  3. Jquery实现form表单回填数据
  4. LARS 算法简介-机器学习
  5. LeetCode简单题之同构字符串
  6. LLVM一些编程语法语义特性
  7. MinkowskiEngine语义分割
  8. 2020年Yann Lecun深度学习笔记(下)
  9. 零起点学算法07——复杂一点的表达式计算
  10. MySQL下载与安装教程以及环境变量配置