根据标题我们就可以清楚地知道登录要经过七层,那么什么是七层?哪七层?每层是做什么的?层与层之间有什么关系?以及七层如何实现登录?下面小编将来解决这些问题。
【什么是七层】
七层就是在三层的基础上与设计模式相结合演化而来,加入了外观模式(外观层)、抽象工厂模式加反射(工厂层)、接口层、实体层,其目的是为了降低各个层之间的耦合度。
【七层及作用】
显示层(UI):根据用户的具体需求,为每个功能模块,部署输入控件、操作控件和输出控件;收集用户输入的数据然后传给外观层。
外观层(Facade):增加外观可以提供一个简单的接口,减少层与层之间的依赖,进而使得耦合度大大降低。
业务逻辑层(BLL):进行逻辑判断和处理;调用工厂中的方法创建相应的接口
工厂层(Factroy):定义一个接口调用接口层,实现BLL层和DAL层之间的数据传递;抽象工厂+反射+配置文件,作用是灵活的实现数据库的连接,方便更换数据库,进一步解耦合
接口层(IDAL):定义一个统一的接口,解除B层和D层的耦合
数据访问层(DAL):数据访问层,提供数据访问的方法,不储存逻辑。在接口中对数据库操作语句进行组合装配。数据访问层是数据库的管理者,但不是访问者,不直接与数据库发生关联。数据库中每个表都对应一个数据访问层的 (访问控制)类。在数据访问层中有SQLHelper类,专用于存放公用的访问数据库方法以让其他访问控制类调用,实现代码复用。数据访问层只与接口层(IDAL)、实体类(Entity)有关联关系。
实体层(Entity):存放全局的实体类,相当于加强的数据结构,实现了对数据的封装。数据库中每个表都对应一个实体类,表的字段就是实体类的属性,类型一一对应。UI、BLL、DLL三层的交互主要就是通过实体类作为参数,并返回信息。实体类不与任何层发生关联关系。
SQLHelper:将D层中重复使用的连接数据库代码抽象到一个层里
Common:MD5加密(可以忽略)
【层与层之间的关系】
UI→DAL、Entity、Facade
Facade→BLL、Entity
BLL→Entity、Factory、IDAL
Factory→IDAL
IDAL→Entity
DAL→Entity、IDAL
【登录】
UI
private void btnOk_Click(object sender, EventArgs e)
{
string name = txtName.Text;
string pwd = txtPwd.Text;
UserFacade userFacade=new UserFacade();
LoginState loginState = userFacade.Login(name, pwd);
switch (loginState)
{
case LoginState.Ok:
FormMain main = new FormMain();
main.Show();
this.Hide();
break;
case LoginState.NameError:
MessageBox.Show("用户名错误,请重新输入");
break;
case LoginState.PwdError:
MessageBox.Show("密码错误,请重新输入");
break;
}
}
private void btnCancel_Click(object sender, EventArgs e)
{
this.Close();
}
Facade
public partial class UserFacade
{
private UserBll userBll;
public UserFacade()
{
userBll=new UserBll();
}
public List<UserInfo> GetList()
{
return userBll.GetList();
}
public LoginState Login(string name, string pwd, out int type)
{
return userBll.Login(name, pwd);
}
}
BLL
public partial class UserBll
{
private UserIDal userIDal;
public UserBll()
{
userIDal = DataAccess.CreateUser();
}
public List<UserInfo> GetList()
{
return userIDal.GetList();
}
public LoginState Login(string name, string pwd)
{
UserInfo mi = userIDal.GetByName(name);
if (mi == null)
{
return LoginState.NameError;
}
else
{
if (mi.MPwd.Equals(pwd))//(Md5Helper.EncryptString(pwd)))
{
return LoginState.Ok;
}
else
{
return LoginState.PwdError;
}
}
}
}
Factory
public partial class DataAccess
{
private static readonly string AssemblyName = ConfigurationManager.AppSettings["DB"];
public static UserIDal CreateUser()
{
string className = AssemblyName + "." + "UserDal";
return (IDAL.UserIDal)Assembly.Load(AssemblyName).CreateInstance(className);
}
}
IDAL
public partial interface UserIDal
{
List<UserInfo> GetList();
UserInfo GetByName(string name);
}
DAL
public partial class UserDal:UserIDal
{
public List<UserInfo> GetList()
{
string sql = "select * from [User]";
DataTable dt = SqlHelper.GetDataTable(sql);
List<UserInfo> list = new List<UserInfo>();
foreach (DataRow row in dt.Rows)
{
list.Add(new UserInfo()
{
MId = Convert.ToInt32(row["mid"]),
MName = row["mname"].ToString(),
MPwd = row["mpwd"].ToString(),
MType = Convert.ToInt32(row["mtype"])
});
}
return list;
}
public UserInfo GetByName(string name)
{
UserInfo mi = null;
string sql = "select * from [User] where mname=@name";
SqlParameter p = new SqlParameter("@name", name);
DataTable dt = SqlHelper.GetDataTable(sql, p);
if (dt.Rows.Count > 0)
{
mi = new UserInfo()
{
MId = Convert.ToInt32(dt.Rows[0][0]),
MName = name,
MPwd = dt.Rows[0][2].ToString(),
MType = Convert.ToInt32(dt.Rows[0][3])
};
}
else
{
}
return mi;
}
}
public static class SqlHelper
{
private static string connStr =ConfigurationManager.AppSettings["ConnStr"];
public static int ExecuteNonQuery(string sql, params SqlParameter[] ps)
{
using (SqlConnection conn = new SqlConnection(connStr))
{
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Parameters.AddRange(ps);
conn.Open();
return cmd.ExecuteNonQuery();
}
}
public static object ExecuteScalar(string sql, params SqlParameter[] ps)
{
using (SqlConnection conn = new SqlConnection(connStr))
{
SqlCommand cmd=new SqlCommand(sql,conn);
cmd.Parameters.AddRange(ps);
conn.Open();
return cmd.ExecuteScalar();
}
}
public static DataTable GetDataTable(string sql, params SqlParameter[] ps)
{
using (SqlConnection conn = new SqlConnection(connStr))
{
SqlDataAdapter adapter=new SqlDataAdapter(sql,conn);
DataTable dt=new DataTable();
adapter.SelectCommand.Parameters.AddRange(ps);
adapter.Fill(dt);
return dt;
}
}
}
Entity
public partial class UserInfo
{
public int MId { get; set; }
public string MName { get; set; }
public string MPwd { get; set; }
public int MType { get; set; }
}
public enum LoginState
{
Ok,
NameError,
PwdError
}
配置文件
<appSettings>
<add key="DB" value="DAL" />
<add key="ConnStr" value="Server=JJ;Database=ChongGou;User ID=sa;PassWord=123;" />
</appSettings>