三层登录——C#版
前言
前期了解三层架构主要是由UI层、BLL层和DAL层三部分构成。看到大牛们都采用三层的思想实现了登录,本菜鸟暗暗地站在了他们的肩膀上。
自己理解
对于三层自己的理解是:就像我们对一个大型的公司去找人门口一定会有门卫,假设你就是一个用户,要去公司找该总经理洽谈业务。这时你会来到门口(UI层),要进去找人,门卫(BLL层)说:“你是谁?你找谁?干什么?等等各种问题。”然后接着就去查询档案(DAL层)。确定总经理是否认识这么个人。就这样“UI层——>BLL层——>DAL层”,然后DAL层给予回应见还是不见;传输层为:“DAL层——>BLL层——>UI层”。
这样门卫因为自己根本不认识这个人,所以不能因为不让他见总经理而得罪他,起到了一个“桥”的作用。在软件开发中,这样有利于减少代码之间的耦合度。从而方便了后期的维护,大大减轻了软件危机的到来。很棒吧~~~
三层架构优缺点
优点
1、符合开闭原则,便于用新的实现去替换原有的实现;
2、降低层与层之间的耦合度;
3、便于后期的复用;
4、标准化,看着舒服;
不足点
1、降低了系统的性能;
2、有时候会导致级联修改;还拿上面的例子来说:若你想再向总经理传达一件事情,可能还需要通过门卫也就是说UI层增加一些功能,BLL层和DAL层可能为了附和这个功能去添加相应的代码;
以上得出;在用三层架构的时候,合适的也是最好的,不要滥用。
C#版三层登录
Entity实体层
<span style="font-family:KaiTi_GB2312;font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Login.Model
{
public class UserInfo
{
public int ID { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public string Email { get; set; }
}
}</span>
D层
<span style="font-family:KaiTi_GB2312;font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Login.DAL
{
public class DbUtil
//server是服务器的名称可以使Local,IP地址,计算机名称;
//DataBase是数据库的名称;
//User ID是登录服务器的用户名;
//Password是登录服务器的密码;
{
public static string ConnString = @"Server=ZLT;Database=Login;User ID=sa;Password=123"; ////下面是用windows身份验证模式链接数据库的;
//public static string ConnString = @"server=.;Database=Login;Integrated Security=ture"; }
}</span>
<span style="font-family:KaiTi_GB2312;font-size:18px;">using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data; namespace Login.DAL
{
public class UserDAO
{
public Login.Model.UserInfo SelectUser(string userName,string password)
{
using (SqlConnection conn = new SqlConnection(DbUtil.ConnString)) //数据库的链接;引用链接数据库的字符串
{
SqlCommand cmd = conn.CreateCommand();//定义命令语句 cmd.CommandText = @"SELECT ID,UserName,Email
FROM USERS WHERE UserName=@UserName AND Password=@Password";//SQL语句,查询表USERS
//cmd.CommandType = Commandtype.Text;
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add(new SqlParameter("@UserName", userName)); //为参数USERNAME,PASSWORD赋值;
cmd.Parameters.Add(new SqlParameter("@Password", password)); conn.Open();//打开数据库; SqlDataReader reader = cmd.ExecuteReader(); //读取数据; Login.Model.UserInfo user = null;
while (reader.Read())
{
if (user == null)
{
user = new Login.Model.UserInfo();
} user.ID = reader.GetInt32(0);//给实体层属性写入数据;
user.UserName = reader.GetString(1);
user.Password = reader.GetString(2);
if (!reader .IsDBNull (2))
{
user.Email = reader.GetString(2);
}
} return user;//将实体返回B层; }
}
}
}</span>
B层
<span style="font-family:KaiTi_GB2312;font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Login.BLL
{
public class LoginManager
{
public Login.Model.UserInfo UserLogin(string userName, string password)
{
Login.DAL.UserDAO uDao = new Login.DAL.UserDAO(); //引用D层的UserDAO类
Login.Model.UserInfo user = uDao.SelectUser(userName, password); //引用实体层的SelectUser方法 if (user != null)
{
return user; //将实体user返回到U层
}
else
{
throw new Exception("登录失败。");//给系统错误进行提示; }
}
}
}
</span>
U层
<span style="font-family:KaiTi_GB2312;font-size:18px;">using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Login.UI; namespace LoginUI
{
public partial class 系统登录 : Form
{
public 系统登录()
{
InitializeComponent();
} private void btnLogin_Click(object sender, EventArgs e)
{
//LoginBLL. svr = new LoginBLL.LoginService();
string userName = txtUserName.Text.Trim();//向实体层的属性写入数据
string password = txtPassword.Text;
Login.BLL.LoginManager manage = new Login.BLL.LoginManager();//引用实体层
Login.Model.UserInfo user = manage.UserLogin(userName, password);//将UI层的用户名和密码通过B层传到实体层; MessageBox.Show("登录用户:" + userName); }
}
}</span>
小结
三层登录——C#版的更多相关文章
- 三层登录——VB.NET版
前言 由于下面的机房收费系统重构自己要用VB.NET进行重构,所以在敲三层登录的时候,实践了一份C#版三层登录,接着就是VB.NET版的三层登录.话说还有七层登录,一下子感觉三层又矮小了.万丈高楼平地 ...
- 三层登录实例VB.NET版详解---理论加实战篇
层,百度百科这样解释,首先-重叠起来的东西:重叠起来的东西中的一部分:层次|表层|大气层.其次-重叠:重复:层峦叠嶂|层出不穷.最后-量词,用于可以分出层次的事物,女孩儿强烈的第六感,三层中的层一定是 ...
- 三层登录实例VB.NET版具体解释---理论加实战篇
层,百度百科这样解释,首先-重叠起来的东西:重叠起来的东西中的一部分:层次|表层|大气层.其次-重叠.反复:层峦叠嶂|层出不穷.最后-量词,用于能够分出层次的事物.女孩儿强烈的第六感,三层中的层一定是 ...
- 三层登录—c#
学习了三层,有一个登录窗口的小练习.是我们第一次接触三层的初战.如今仅仅是简单的了解了一些,须要学习的还有非常多,以下浅谈自己的理解. 我们说的三层就是分层了显示层.业务逻辑层和数据訪问层.当中显示层 ...
- 三层——vb.net版
经过不懈的努力,我的vb.net 版的三层登陆终于实现了.下面将我的成果向大家展示一下. 原则 vb.net的三层登陆跟C#的三层登陆的思想是一样的都是将系统分层--U层只负责与用户 ...
- 简单的模拟登录Wap版新浪微博
环境:Ubuntu 16.04 python版本3.5+ import requests, lxml from bs4 import BeautifulSoup from io import Byte ...
- Asp.Net微信登录-电脑版扫描二维码登录
像京东,一号店等网站都实现了用微信来登录的功能,就是用手机上的微信扫一扫网站上的二维码,微信上确认后,即可自动用微信的帐号登录网站. 一.创建网站应用 在微信开放平台创建一个网站应用 https:// ...
- C#微信登录-电脑版扫描二维码登录
像京东,一号店等网站都实现了用微信来登录的功能,就是用手机上的微信扫一扫网站上的二维码,微信上确认后,即可自动用微信的帐号登录网站. 一.创建网站应用 在微信开放平台创建一个网站应用 https:// ...
- 如何从零开始对接第三方登录(Java版):QQ登录和微博登录
前言 个人网站最近增加了评论功能,为了方便用户不用注册就可以评论,对接了QQ和微博这2大常用软件的一键登录,总的来说其实都挺简单的,可能会有一点小坑,但不算多,完整记录下来方便后来人快速对接. 后台设 ...
随机推荐
- 文件操作类(QFileDialog、QFileInfo、QDir、QDirIterator、QFile)
一.QFileDialog 用于弹出打开或保存对话框,然后返回选择的文件或文件夹 1.可以筛选所需要的文件类型 2.可以设置是否多选 3.可以设置保存还是打开 二.QFileInfo 保存了文件相关信 ...
- 【leetcode刷题笔记】Best Time to Buy and Sell Stock III
Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...
- 8个Javascript小技巧,让你写的代码有腔调
如果你想确保你的JavaScript在大多数浏览器和移动设备中都可以工作,那么我从大漠等大神指导,原来可以使用f2etest,也可以使用Endtest,browserstack等 1. 使用 + 字符 ...
- Nhibernate 三种配置方式
1 App.config 的配置: <?xml version="1.0" encoding="utf-8" ?><configuration ...
- tomcat可以访问默认页面,但是无法访问webapp下的指定项目
tomcat可以访问默认页面,但是无法访问webapp下的指定项目 1.注意下安装tomcat时的默认端口,8005,8009,8080,我这边没有修改,根据需要自行修改,确保tomcat可以启动 ...
- CodeForces-734E Anton and Tree 树的直径
题目大意: 给定一棵有n个节点的树,有黑点白点两种节点. 每一次操作可以选择一个同种颜色的联通块将其染成同一种颜色 现在给定一个初始局面问最少多少步可以让树变为纯色. 题解: 首先我们拿到这棵树时先将 ...
- 【LeetCode】085. Maximal Rectangle
题目: Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing only 1's ...
- POJ2559:Largest Rectangle in a Histogram
浅谈栈:https://www.cnblogs.com/AKMer/p/10278222.html 题目传送门:http://poj.org/problem?id=2559 贪心的想,最大的子矩阵顶部 ...
- centos7添加环境变量
# vim /etc/profile在最后,添加:export PATH="/usr/local/webserver/mysql/bin:$PATH" #添加的路径保存,退出,然后 ...
- 【转】 Pro Android学习笔记(六四):安全和权限(1):签发apk
目录(?)[-] Android安全模型 数字证书签发 Debug的keystore 生产unsigned的apk 为apk进行证书签发 align安装包 使用Export Wizard生成签发的ap ...