师傅给讲过反射+配置文件之后豁然开朗,对七层整体的架构了解又有了一个新的认识,今天开始机房七层登陆的,,嗯,算是重构吧,在之前的七层的基础上重新做一个新的认识。
实体层(Model)完成了,很简单,只有UserID和UserPwd
接口层(IDAL)其次,简单的写出一个方法,在DAL层里面使用
DAL层,这个真的是了解了太多了,包括从开始的命名,反射就用在这里,为什么能换数据库,就是全都在命名上。
sqlhelper主要作用就是用来连接数据库进行一系列的操作
sqlchargeDAL和sqltestDAL两个分别是对不同数据库的调用
UI层,主要是将需要用到的东西实例化,添加配置文件,在这里配置文件要细说一下,这些东西敲好之后都会封装成为dll文件,要想换数据库的话,就是反射+抽象工厂+配置文件,还数据库的话就重新写一个配置文件,然后将配置文件换掉就好了,快捷方便。
外观层(Facade)就是将UI和DAL层的数据进行一个交互,就相当于一个中介的作用。目的是解耦,让UI和BLL层少一些耦合,UI的代码更加的清晰。
工厂层(Factory),这就是抽象工厂层,用上反射,搭配着配置文件来选择不同的DB。
逻辑层(BLL),首先将外观层传进来的数据进行一个逻辑操作,然后交给DAL层操作,其次就是从DAL层传回来时还需要进行逻辑操作返回需要用到的值。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Model
{
public class UserInfo
{
private string userid;
private string userPwd;
private string level;
private string name;
private string head;
public string UserID
{
get { return userid; }
set { userid = value; }
}
public string UserPwd
{
get { return userPwd; }
set { userPwd = value; }
}
public string UserLevel
{
get { return level; }
set { level = value; }
}
public string UserName
{
get { return name; }
set { name = value; }
}
public string Head
{
get { return head; }
set { head = value; }
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace LoginUI
{
public partial class Form1 : Form
{
public static string level;
public Form1()
{
InitializeComponent();
}
public void btnLogin_Click(object sender, EventArgs e)
{
//实例化用户
Model.UserInfo user = new Model.UserInfo();
user.UserID = txtUserID.Text.ToString();
user.UserPwd = txtUserPwd.Text;
//传入外观层
LoginFacade.LoginFacade facade = new LoginFacade.LoginFacade();
IList serveruser = facade.SelectUser(user);
if (user.UserPwd != serveruser[0].UserPwd.ToString().Trim())
{
MessageBox.Show("登陆失败");
}
else
{
string level = serveruser[0].UserLevel.ToString().Trim();
MessageBox.Show(level + " 登陆成功");
this.Hide();
//调用frmMain,把值传到frmMain中
frmMain.frmMain fm = new frmMain.frmMain(level, user.UserID.ToString());
fm.Show();
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LoginFacade
{
public class LoginFacade
{
public IList SelectUser(Model.UserInfo userInfo)
{
LoginBLL.LoginBLL userBLL = new LoginBLL.LoginBLL();
IList user = userBLL.UserBLL(userInfo);
return user;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
namespace LoginIDAL
{
public interface IDAL
{
IList selectUser(Model.UserInfo userInfo);
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using System.Configuration;
using System.Windows.Forms;
namespace LoginDAL
{
public class SqlHelper
{
private SqlConnection conn = null;
private SqlCommand cmd = null;
private SqlDataReader sdr = null;
public SqlHelper()
{
string connStr = ConfigurationManager.AppSettings["ConnStr"];
conn = new SqlConnection(connStr);
}
private SqlConnection GetConn()
{
if (conn.State == ConnectionState.Closed)
conn.Open();
return conn;
}
///
/// 执行并且返回值为受影响行数的执行不带参数的sql语句或存储过程
///
/// sql语句
/// 命令类型
/// 返回受影响行数
public int ExecuteNonQuery(string cmdText, CommandType ct)
{
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;
}
///
/// 执行并且返回值为受影响行数的执行带参数的sql语句或存储过程
///
/// sql语句
/// 需要查询的参数
/// 命令类型
/// 返回受影响的行数
public int ExecuteNonQuery(string cmdText, SqlParameter[] paras, CommandType ct)
{
int res;
using (cmd = new SqlCommand(cmdText, GetConn()))
{
cmd.CommandType = ct;
cmd.Parameters.AddRange(paras);
res = cmd.ExecuteNonQuery();
conn.Close();
}
return res;
}
///
/// 执行并且返回值为Datatable的执行带参数的查询sql语句或存储过程
///
/// sql语句
/// 命令类型
/// 返回Datatable
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;
}
///
/// 执行并且返回值为Datatable的执行带参数的查询sql语句或存储过程
///
/// 查询SQL语句或存储过程
/// 参数集合
/// 命令类型
/// 返回Datatable
public DataTable ExecuteQuery(string cmdText, SqlParameter[] paras, CommandType ct)
{
DataTable dt = new DataTable();
cmd = new SqlCommand(cmdText, GetConn());
cmd.Parameters.AddRange(paras);
using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
dt.Load(sdr);
}
return dt;
}
}
}
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using Model;
using System.Data.SqlClient;
namespace LoginDAL
{
class SqlnewchargeDAL : LoginIDAL.IDAL
{
//public DataTable selectUser(UserInfo userInfo)
public IList selectUser(UserInfo userInfo)
{
SqlHelper sqlhelper = new SqlHelper();
//SqlParameter[] sqlparams = { new SqlParameter("@userID", userInfo.UserID), new SqlParameter("@userPwd", userInfo.UserPwd) };
SqlParameter[] sqlparams = { new SqlParameter("@userID", userInfo.UserID)};
//string sql = @"SELECT * FROM [User_Info] WHERE UserID=@UserID and UserPwd=@UserPwd";
string sql = @"SELECT * FROM [User_Info] WHERE UserID=@UserID";
DataTable table = sqlhelper.ExecuteQuery(sql, sqlparams, CommandType.Text);
IList user = LoginDAL.ConvertHelper.ConvertToModel(table);
return user;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Configuration;
namespace LoginFactory
{
public class ServerFactory
{
string AssemblyName = "LoginDAL";
string strDB = ConfigurationManager.AppSettings["DB"];
public LoginIDAL.IDAL CreateUser()
{
string ClassName = AssemblyName + "." +strDB+ "DAL";
return (LoginIDAL.IDAL)Assembly.Load(AssemblyName).CreateInstance(ClassName);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
namespace LoginBLL
{
public class LoginBLL
{
public IList UserBLL(Model.UserInfo userInfo)
{
LoginFactory.ServerFactory fact = new LoginFactory.ServerFactory();
LoginIDAL.IDAL idal = fact.CreateUser();
IList user = idal.selectUser(userInfo);
//返回值为用户级别
//string flag = null;
//判断是有有此用户
if (user.Count == 0)
{
user = null;
}
else
{
//flag = (user[0].UserPwd.Trim() == userInfo.UserPwd) ? "success" : "fail";
}
return user;
}
}
}