有兴趣的一起来讨论下三层开发模式吧~~
根据网上查找的资料和自己的理解,下面是我的理解。
首先我们来看下三层架构的一些基本定义:
1、什么是三层架构呢?通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。区分层次的目的即为了“高内聚,低耦合”的思想。
2、表现层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得。
3、业务逻辑层(BLL):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。![]()
4、数据访问层(DAL):该层所做事务直接操作数据库,针对数据的增、删、改、查。

也就是说表现层只能操作、调用业务逻辑层,业务逻辑层直接操作数据访问层。下面自己的一个例子来看下三层结构的组织。
在OABLL中的文件调用OADAL中的方法,比如其中一个 用户登录 的结构:
首先查看OACOMMON中的UserLogin.cs
1

/**//// <summary>2
/// 用户登录信息3
/// </summary>4
public class UserLogin5

{6

私有属性#region 私有属性7
private string _sLoginName; //登录用户名8
private string _sPassWord; // 登录密码9
private string _sCode; //登录验证码10
#endregion11

12

公有属性#region 公有属性13

/**//// <summary>14
/// 用户登录名15
/// </summary>16
protected string sLoginName17

{18
get19

{20
return this._sLoginName;21
}22
set23

{24
this._sLoginName = value;25
}26
}27

/**//// <summary>28
/// 用户登录密码29
/// </summary>30
protected string sPassWord31

{32
get33

{34
return this._sPassWord;35
}36
set37

{38
this._sPassWord = value;39
}40
}41

/**//// <summary>42
/// 登录验证码43
/// </summary>44
protected string sCode45

{46
get47

{48
return this._sCode;49
}50
set51

{52
this._sCode = value;53
}54
}55
#endregion56
}
数据访问层操作代码UserLogin.cs
1

/**//// <summary>2
/// 用户登录数据访问层3
/// 所属数据访问层4
/// 功能:通过sql语句操作数据库5
/// </summary>6
public class UserLogin7

{8
public bool CheckLogin(string sUserName, string sPassWord)9

{10
bool bCheck = false;11
string cmdText = "Select * from sys_User where U_LoginName='{0}' and U_Password='{1}'"; 12
cmdText = string.Format(cmdText, PGGS.OA.OACOMMON.Common.inSQL(sUserName), PGGS.OA.OACOMMON.Common.md5(sPassWord, 32)); 13
DataSet ds = PGGS.OA.DB.SqlHelper.dataSet(cmdText, "login");14
if (ds.Tables[0].Rows.Count > 0)15

{16
PGGS.OA.OACOMMON.Components.UserData uDT = new PGGS.OA.OACOMMON.Components.UserData();17
uDT.U_Status = int.Parse(ds.Tables[0].Rows[0]["U_Status"].ToString());18
bCheck = true;19
}20
else21

{22
bCheck = false;23
}24
return bCheck;25
}26
public bool CheckUser(string sUserName)27

{28
bool bCheck = false;29
string cmdText = "Select * from sys_User where U_LoginName='{0}'";30
cmdText = string.Format(cmdText, PGGS.OA.OACOMMON.Common.inSQL(sUserName));31
DataSet ds = PGGS.OA.DB.SqlHelper.dataSet(cmdText, "user");32
if (ds.Tables[0].Rows.Count > 0)33

{34
bCheck = true;35
}36
else37

{38
bCheck = false;39
}40
return bCheck;41
}42
}同理业务逻辑层UserLogin.cs代码:
1

/**//// <summary>2
/// 用户登录业务类3
/// 所属业务逻辑层4
/// 功能:用户登录验证及转向5
/// </summary>6
public class UserLogin7

{8

"判断输入的用户名与密码是否对应 bool CheckLogin(string sUserName, string sPassWord)"#region "判断输入的用户名与密码是否对应 bool CheckLogin(string sUserName, string sPassWord)"9

/**//// <summary>10
/// 判断输入的用户名与密码是否对应11
/// </summary>12
/// <param name="sUserName">输入的用户名</param>13
/// <param name="sPassWord">输入的密码</param>14
/// <returns></returns>15
public bool CheckLogin(string sUserName, string sPassWord)16

{17
bool bCheck = false;18
PGGS.OA.OADAL.UserLogin dalUserLogin = new PGGS.OA.OADAL.UserLogin();19
if (dalUserLogin.CheckLogin(sUserName, sPassWord))20

{21
bCheck = true;22
}23
else24

{25
bCheck = false;26
}27
return bCheck;28
}29
#endregion30

31

"判断输入的用户是否存在 bool CheckUser(string sUserName)"#region "判断输入的用户是否存在 bool CheckUser(string sUserName)"32

/**//// <summary>33
/// 判断输入的用户是否存在34
/// </summary>35
/// <param name="sUserName">输入的用户名</param>36
/// <returns></returns>37
public bool CheckUser(string sUserName)38

{39
bool bCheck = false;40
PGGS.OA.OADAL.UserLogin dalUserLogin = new PGGS.OA.OADAL.UserLogin();41
if (dalUserLogin.CheckUser(sUserName))42

{43
bCheck = true;44
}45
else46

{47
bCheck = false;48
}49
return bCheck;50
}51
#endregion52

53

"与界面表现层的接口,用来判断用户登录 void GetLogin(string sUserName,string sPassWord,string sCode)"#region "与界面表现层的接口,用来判断用户登录 void GetLogin(string sUserName,string sPassWord,string sCode)"54

/**//// <summary>55
/// 与界面表现层的接口,用来判断用户登录56
/// </summary>57
/// <param name="sUserName">用户登录名</param>58
/// <param name="sPassWord">用户登录密码</param>59
/// <param name="sCode">用户登录验证码</param>60
public void GetLogin(string sUserName,string sPassWord,string sCode)61

{62
object checkCode = HttpContext.Current.Session["CheckCode"];63

64
//进行验证码判断65
if (checkCode == null || sCode != checkCode.ToString()) 66

{67
HttpContext.Current.Response.Write("验证码不正确!");68
HttpContext.Current.Response.End();69
}70
//验证码判断成功则转向对用户登录名与密码的判断71
else 72

{73
PGGS.OA.OACOMMON.Components.UserData uDT = new PGGS.OA.OACOMMON.Components.UserData();74
//判断用户名是否存在75
if (CheckUser(sUserName))76

{77
//用户名存在则判断用户名密码是否对应78
if (CheckLogin(sUserName, sPassWord))79

{80
//当前状态0:正常 1:禁止登陆 2:删除81
if (uDT.U_Status == 0)82

{83
HttpContext.Current.Response.Redirect("Default.aspx");84
//HttpContext.Current.Response.Write("正常");85
HttpContext.Current.Response.End();86
}87
else if (uDT.U_Status == 1)88

{89
HttpContext.Current.Response.Write("禁止登陆");90
HttpContext.Current.Response.End();91
}92
else if (uDT.U_Status == 2)93

{94
HttpContext.Current.Response.Write("删除");95
HttpContext.Current.Response.End();96
}97
else98

{99
HttpContext.Current.Response.Write("未知错误");100
HttpContext.Current.Response.End();101
}102
}103
else104

{105
//密码不正确106
HttpContext.Current.Response.Write("密码不正确");107
HttpContext.Current.Response.End();108
}109
}110
else111

{112
//用户名不存在113
HttpContext.Current.Response.Write("用户名不存在");114
HttpContext.Current.Response.End();115
}116
}117

118
}119
#endregion120
121
}
通过在界面表现层上 点击 “登录” 按钮之后的操作:
1
protected void Button1_Click(object sender, EventArgs e)
2
{
3
string sUserName = LoginName.Text.ToString().Trim();
4
string sPassWord = LoginPass.Text.ToString().Trim();
5
string sCode = code_op.Text.ToString().Trim();
6
PGGS.OA.OABLL.UserLogin bllUserLogin = new PGGS.OA.OABLL.UserLogin();
7
bllUserLogin.GetLogin(sUserName, sPassWord, sCode);
8
}
protected void Button1_Click(object sender, EventArgs e)2

{3
string sUserName = LoginName.Text.ToString().Trim();4
string sPassWord = LoginPass.Text.ToString().Trim();5
string sCode = code_op.Text.ToString().Trim(); 6
PGGS.OA.OABLL.UserLogin bllUserLogin = new PGGS.OA.OABLL.UserLogin();7
bllUserLogin.GetLogin(sUserName, sPassWord, sCode);8
} 这样基本把一个用户登录的三层架构完成了,也不知道这样是否正确。还请大家相互讨论,欢迎大家提供高意见或者建议,谢谢~~~


