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

也就是说表现层只能操作、调用业务逻辑层,业务逻辑层直接操作数据访问层。下面自己的一个例子来看下三层结构的组织。

在OABLL中的文件调用OADAL中的方法,比如其中一个 用户登录 的结构:
首先查看OACOMMON中的UserLogin.cs

UserLogin.cs
1
/**//// <summary>
2
/// 用户登录信息
3
/// </summary>
4
public class UserLogin
5
{
6
私有属性#region 私有属性
7
private string _sLoginName; //登录用户名
8
private string _sPassWord; // 登录密码
9
private string _sCode; //登录验证码
10
#endregion
11
12
公有属性#region 公有属性
13
/**//// <summary>
14
/// 用户登录名
15
/// </summary>
16
protected string sLoginName
17
{
18
get
19
{
20
return this._sLoginName;
21
}
22
set
23
{
24
this._sLoginName = value;
25
}
26
}
27
/**//// <summary>
28
/// 用户登录密码
29
/// </summary>
30
protected string sPassWord
31
{
32
get
33
{
34
return this._sPassWord;
35
}
36
set
37
{
38
this._sPassWord = value;
39
}
40
}
41
/**//// <summary>
42
/// 登录验证码
43
/// </summary>
44
protected string sCode
45
{
46
get
47
{
48
return this._sCode;
49
}
50
set
51
{
52
this._sCode = value;
53
}
54
}
55
#endregion
56
}
数据访问层操作代码UserLogin.cs

UserLogin.cs
1
/**//// <summary>
2
/// 用户登录数据访问层
3
/// 所属数据访问层
4
/// 功能:通过sql语句操作数据库
5
/// </summary>
6
public class UserLogin
7
{
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
else
21
{
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
else
37
{
38
bCheck = false;
39
}
40
return bCheck;
41
}
42
}
同理业务逻辑层UserLogin.cs代码:

UserLogin.cs
1
/**//// <summary>
2
/// 用户登录业务类
3
/// 所属业务逻辑层
4
/// 功能:用户登录验证及转向
5
/// </summary>
6
public class UserLogin
7
{
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
else
24
{
25
bCheck = false;
26
}
27
return bCheck;
28
}
29
#endregion
30
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
else
46
{
47
bCheck = false;
48
}
49
return bCheck;
50
}
51
#endregion
52
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
else
98
{
99
HttpContext.Current.Response.Write("未知错误");
100
HttpContext.Current.Response.End();
101
}
102
}
103
else
104
{
105
//密码不正确
106
HttpContext.Current.Response.Write("密码不正确");
107
HttpContext.Current.Response.End();
108
}
109
}
110
else
111
{
112
//用户名不存在
113
HttpContext.Current.Response.Write("用户名不存在");
114
HttpContext.Current.Response.End();
115
}
116
}
117
118
}
119
#endregion
120
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
}
这样基本把一个用户登录的三层架构完成了,也不知道这样是否正确。还请大家相互讨论,欢迎大家提供高意见或者建议,谢谢~~~