C#机房重构三层登陆与设计模式结合
前言:
七层登录一开始就没有弄清楚UI层和BLL层具体的职责,所以导致在机房重构的时候把登录的代码逻辑全部都写到了UI层。庆幸的是发现的早,在刚敲完登录就发现了。没有在完成整个重构再发现,哪个时候改代码可就废了劲了。
好了废话不多说,下面具体介绍七层都是那些和具体每一层的职责!
七层结构:
职责:
LoginBLL(业务逻辑层,实现业务逻辑)
loginDAL(数据访问层,实现数据操作)
loginEnitity(实体层,负责在每层之间传递数据)
loginFacade(外观层,负责统一BLL层的功能,和向BLL层传递数据)
loginFactroy(工厂层,负责创建DAL层具体的查询类)
loginIDAL(接口层,定义一个具体的功能接口。让DAL层实现这个具体的功能)
loginUI(界面层,负责接收用户输入和显示数据!)
七层之间的关系:
从这个关系图中可以明确的看到,每层之间的一个引用关系。还有DAL层是去实现接口层的功能。
代码实现:
LoginEnitity:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LoginEnitity
{
/// <summary>
/// 实体层
/// </summary>
public class UserInfo
{
//定义用户UserName属性
public string UserName { get; set; }
//定义用户UserPwd属性
public string UserPwd { get; set; }
//定义用户等级
public string UserLeve { get; set; }
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
LoginUI:
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 LoginEnitity;
using LoginFacade;
namespace LoginUI
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
//判断用户密码是否为空
if (txtUserName.Text.Trim()=="")
{
MessageBox.Show("请输入你的用户名!","提示",MessageBoxButtons.OK,MessageBoxIcon.Warning);
}
if (txtUserPwd.Text== "")
{
MessageBox.Show("请输入你的密码!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
try
{
//实例化一个用户
LoginEnitity.UserInfo user = new UserInfo();
//接收信息
user.UserName = txtUserName.Text;
user.UserPwd = txtUserPwd.Text;
int[] flag = new int[3];
LoginFacade.LoginFacade Flogin = new LoginFacade.LoginFacade();
flag = Flogin.SelectUser(user);
//调用显示窗体方法
WorkLogin workLoing = new WorkLogin();
workLoing.workLogin(flag);
this.Hide();//隐藏本窗体
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
LoginFacade:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LoginBLL;
using LoginEnitity;
using System.Data;
namespace LoginFacade
{
/// <summary>
/// 外观层
/// </summary>
public class LoginFacade
{
/// <summary>
/// 判断用户是否存在
/// </summary>
/// <param name="user">用户</param>
/// <returns></returns>
public int[] SelectUser(UserInfo user)
{
int[] flag=new int[3];
LoginBLL.LoginBLL usrBLL = new LoginBLL.LoginBLL();
flag = usrBLL.UserBLL(user);
return flag;
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
LoginBLL:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LoginEnitity;
using LoginFactory;
using LoginIDAL;
using System.Data;
namespace LoginBLL
{
/// <summary>
/// 业务逻辑
/// </summary>
public class LoginBLL
{
/// <summary>
/// 判断用户是否存在
/// </summary>
/// <param name="user">用户</param>
/// <returns>返回是否存在</returns>
public int[] UserBLL(UserInfo user)
{
//返回的值
int[] flgeLog = new int[3];
//实例化工厂
LoginFactory.LoginFactory fact = new LoginFactory.LoginFactory();
//调用工方法创建接口
LoginIDAL.LoginIDAL idal = fact.CreateUser();
//接收D层的返回值
DataTable table = idal.SelectUser(user);
bool flag;
//返回数据表的类型,如果等于 0.
//则是没有符合该账户密码的用户
if (table.Rows.Count == 0)
{
flag = false;
}
else
{
flag = true;
}//end if
//判断用户是否存在,根据上面表里有没有内容的返回值判断!
if (flag != false)
{
//存在
flgeLog[0] = 1;
}//end if
return flgeLog;//返回数值,账号存不存在
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
LoginFactory :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LoginIDAL;
using System.Reflection;
using System.Configuration;
namespace LoginFactory
{
/// <summary>
/// 工厂层
/// </summary>
public class LoginFactory
{
//获取配置文件
string StrDB = System.Configuration.ConfigurationManager.AppSettings["DB"];
//应用反射获得DAL层操作
public LoginIDAL.LoginIDAL CreateUser()
{
string ClassName = StrDB +"."+"LoginDal";
// string ClassName = "LoginDAL.LoginDal";
return (LoginIDAL.LoginIDAL)Assembly.Load(StrDB).CreateInstance(ClassName);
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
LoginIDAL:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LoginEnitity;
//命名空间
using System.Data;
namespace LoginIDAL
{
/// <summary>
/// 接口层
/// </summary>
public interface LoginIDAL
{
//放置接口函数,判断要登录的用户是否在数据表中。
DataTable SelectUser(UserInfo user);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
LoginDAL:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using LoginIDAL;
using LoginEnitity;
namespace LoginDAL
{
/// <summary>
/// 登录查询
/// </summary>
public class LoginDal:LoginIDAL.LoginIDAL
{
/// <summary>
/// 实现接口
/// </summary>
/// <param name="user">用户</param>
/// <returns>返回是否存在</returns>
public DataTable SelectUser(UserInfo user)
{
//实例化数据操作类,进行数据查询,并获取返回值
SQLHelper sqlHelper = new SQLHelper();
//数据库表里的内容和实体的内容进行一一映射。
SqlParameter[] sqlparms = {new SqlParameter("@UserName",user.UserName)};
string sql = @"select * from [User_Info] where UserName=@UserName";
//把查询的信息储存到临时表
DataTable table = sqlHelper.ExecuteQuery(sql,sqlparms,CommandType.Text);
return table;
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
SQLHerlper:
其实SQLHerper也可以算作一层,因为SQLHerper把在查询数据用到的相同功能都放到了一起。所以七层也好八层也好,重点还是要把代码做到。可复用,可扩展。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LoginEnitity;
using LoginIDAL;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
namespace LoginDAL
{
//数据集访问层---数据操作类
public class SQLHelper
{
//定义数据库连接操作,指定在数据库上操作的类型,定义数据库读取操作
private SqlConnection conn = null;//连接
private SqlCommand cmd = null;//命令
private SqlDataReader sdr = null;//数据集
/// <summary>
/// 数据库连接
/// </summary>
public SQLHelper()
{
string connStr = ConfigurationManager.AppSettings["connStr"];
conn = new SqlConnection(connStr);
}
private SqlConnection GetConn()
{
//判断状态是否为空打开状态
if (conn.State==ConnectionState.Closed)
{
conn.Open();//打开
}//end if
return conn;
}
/// <summary>
/// 执行不带参数的数据库操作或储存过程
/// </summary>
/// <param name="cmdText">增删改查操作</param>
/// <param name="ct">命令类型</param>
/// <returns>返回受影响的行数</returns>
public int ExecuteNonQuery(string cmdText,CommandType ct)
{
int res;
cmd = new SqlCommand(cmdText, GetConn());
cmd.CommandType = ct;
res = cmd.ExecuteNonQuery();
if (conn.State == ConnectionState.Open)
{
conn.Close();
}
return res;
}
/// <summary>
/// 执行带参数的数据库操作或储存过程
/// </summary>
/// <param name="cmdText">增删改查操作</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.Add(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;
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
实现结果:
文章来源: kangshihang.blog.csdn.net,作者:康世行,版权归原作者所有,如需转载,请联系作者。
原文链接:kangshihang.blog.csdn.net/article/details/103504432
- 点赞
- 收藏
- 关注作者
评论(0)