C#机房重构三层登陆与设计模式结合
【摘要】
前言: 七层登录一开始就没有弄清楚UI层和BLL层具体的职责,所以导致在机房重构的时候把登录的代码逻辑全部都写到了UI层。庆幸的是发现的早,在刚敲完登录就发现了。没有在完成整个重构再发现,哪个时候改代码可...
前言:
七层登录一开始就没有弄清楚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; }
}
}
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);
}
}
}
}
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;
}
}
}
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;//返回数值,账号存不存在
}
}
}
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);
}
}
}
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);
}
}
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;
}
}
}
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;
}
}
}
实现结果:
文章来源: kangshihang.blog.csdn.net,作者:康世行,版权归原作者所有,如需转载,请联系作者。
原文链接:kangshihang.blog.csdn.net/article/details/103504432
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)