从三层到七层的变化 使得我都不知道从哪里下手了,其中增加了一个外观层(Facade)和一个工厂层(Factory)另外还有了一个接口。而这些层与层之间 都有自己的职能。但是总的核心就是:“解耦”。 开始机房重构有一段时间了,现在回想一下自己当时敲登陆窗体的时候遇到了各种各样的问题,例如代码的逻辑走不通,不知道该什么时候调用 一系列问题。
实现步骤:
1、创建Entity,实现业务实体。
2、创建IDAL,实现接口。
3、创建DAL,实现接口里的方法。
4、增加APP.config里的配置信息,为提供DAL的程序集。
5、创建Factory,返回程序集的指定类的实例。
6、创建BLL,调用Factory,得到程序集指定类的实例,完成数据操作方法。
7、创建Facade,调用BLL,得到BLL层的处理结果返回值。
8、创建UI,调用Facade里的数据操作方法,实现登录。
代码实现
Entity
public class UserInfo
{
//定义 用户ID 字段
private string userid;
public string UserID
{
get { return userid; }
set { userid = value; }
}
//定义 密码 字段
private string password;
public string Password
{
get { return password; }
set { password = value; }
}
}
IDAL层
namespace IDAL
{
public interface LoginIDAL
{
DataTable selectUser(Entity.UserInfo UserInfo);
}
}
DAL层
public class LoginDAL : IDAL.LoginIDAL
{
public DataTable selectUser(Entity.UserInfo UserInfo) //selectUser该方法即是IDAL接口的方法
{
SQLHelper SQLHelper = new SQLHelper(); //实例化 跳转到SQLHelper层
//声明一个SQL参数的数组 params可变数组
SqlParameter[] sqlParams = { new SqlParameter("@txtUserID", UserInfo.UserID), new SqlParameter("@txtPWD", UserInfo.Password) }; //用户名和密码
string sql = @"SELECT * FROM User_Info WHERE UserID=@txtUserID and PWD=@txtPWD"; //查的语句用户名和密码相等并且状态为 True and state = 'True'
DataTable table = SQLHelper.ExecuteQuery(sql, sqlParams, CommandType.Text);
return table;
}
}
SQLHelper
public class SQLHelper
{
#region 构造函数
private SqlConnection conn = null; //SqlConnection 打开连接
private SqlCommand cmd = null; //SqlCommand对象允许你指定在数据库上执行的操作的类型。比如,你能够对数据库中的行数据执行select,insert,modify以及delete命令。
//SqlCommand对象能被用来支持断开连接数据管理的情况,可以只单独使用SqlCommand对象。也可以与SqlDataAdapter一起实现断开数据连接,实现操作数据库的应用程序
private SqlDataReader sdr = null; //读取只进的行流的方式
public SQLHelper()
{
string connStr = ConfigurationManager.AppSettings["connStr"]; //ConnStr 是配置文件里连接数据库的关键字,引用这一句可以连接数据库
conn = new SqlConnection(connStr); //实例化一个连接
}
#endregion
#region SQL连接打开
private SqlConnection GetConn()
{
if (conn.State == ConnectionState.Closed) //如果连接状态为关闭
{
conn.Open(); //则打开
}
return conn;
}
#endregion
#region 非存储过程
/// <summary>
/// 执行不带参数的的 增删改 SQL语句或者存储过程
/// </summary>
/// <param name="cmdText">增删改SQL</param>
/// <param name="ct">命令类型</param>
/// <returns>返回受影响的行数</returns>
public int ExecuteNonQuery(string cmdText, CommandType ct)
//增删改 SQL 命令类型
{
int res;
try
{
cmd = new SqlCommand(cmdText, GetConn()); //打开连接
cmd.CommandType = ct;
res = cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (conn.State == ConnectionState.Open)
{
conn.Close(); //关闭数据库 与上面相对应
}
}
return res;
}
/// <summary>
/// 执行带参数的的 增删改 SQL语句或者存储过程
/// </summary>
/// <param name="cmdText">增删改SQL</param>
/// <param name="paras">要查询的参数</param>
/// <param name="ct">命令类型</param>
/// <returns>返回受影响的行数</returns>
public int ExecuteNonQuery(string cmdText, SqlParameter[] paras, CommandType ct)
{
int res;
using (cmd = new SqlCommand(cmdText, GetConn())) //使用using,可以自动关闭数据库
{
cmd.CommandType = ct;
cmd.Parameters.AddRange(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;
}
#endregion
}
App
<appSettings>
<add key="ConnStr" value="server=TZK;database=jifang;uid=sa;pwd=123456"/>
<add key="DB" value="DAL"/>
<!--ConnStr 为 连接数据库 key为键值,引用字符DB,value代表引用的真正的内容-->
</appSettings>
Factory
public class LoginFactory
{
string StrDB = System.Configuration.ConfigurationManager.AppSettings["DB"]; //接收来自配置文件的数据
public IDAL.LoginIDAL CreateUser()
{
string ClassName = StrDB + "." + "LoginDAL"; //这里的LoginDAL是D层的类名
return (IDAL.LoginIDAL)Assembly.Load(StrDB).CreateInstance(ClassName); //反射加工厂的应用
}
}
BLL
public class LoginBLL
{
public bool UserBLL(Entity.UserInfo UserInfo)
{
Factory.LoginFactory fact = new Factory.LoginFactory(); //实例化工厂 跳转到Factory层 接收配置文件的数据,接收完成之后再回来
IDAL.LoginIDAL idal = fact.CreateUser(); //调用工厂方法创建接口 跳转Factory 使用CreateUser的方法
DataTable table = idal.selectUser(UserInfo); //接收D层的返回值 跳转到DAL层
bool flag;
if (table.Rows.Count == 0) //返回DataTable类型,如果他的行数等于0,说明没有符合该账号密码的用户
{
flag = false;
}
else
{
flag = true;
}
return flag;
}