资源描述
三层架构,通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。区分层次的目的即为了“高内聚,低耦合”的思想。
一、英文拓展:
三层架构(3-Tier ASrchitecture)
表现层UI(User Interface)
业务逻辑层BLL(Business Logic Layer)
数据访问层DAL(Data Access Layer)
二、各层作用解析:
1、DAL作用:
1)从数据源加载数据Select
2)向数据源写入数据Insert/Update
3)从数据源删除数据Delete
2、UI的作用:
1)向用户展现特定业务数据。
2)采集用户的输入信息和操作。
3)特定的数据显示给用户
原则:用户至上,界面简洁明了
3、BLL的作用:
1)从DAL中获取数据,供UI显示用。
2)从UI中获取用户指令和数据,执行业务逻辑。
3)从UI中获取用户指令和数据,通过DAL写入数据源。
BLL的职责机制:
UI——BLL——UI
UI——BLL——DAL——BLL——UI
4、数据模型的引入:
为了避免三层之间的互相引用,所以出现Model,用于传输数据的,业务数据模型
三、系统登陆实例,步骤:
1、新建数据库
(名称)LoginDemo,包含两张表:
新建表Users
其中,设定ID为主键,自增长。
新建表Scores
其中,设定ID为主键,自增长。
2、编码阶段:
解决方案名称:LoginSolution
位置:LoginDemo
1)DAL数据访问层:
新建项目名称:LoginDAL
默认命名空间:Login.DAL
添加类:UserDAO,ScoreDAO,DbUtil
引用:LoginModel
[csharp] view plaincopyprint?
1. namespace Login.DAL
2. {
3. class DbUtil
4. {
5. //sever机器名,Database数据库名,
6. public static string ConnString = @"Server=192.168.**.**;Database=LoginDemo;User ID=sa;Password=123456";
7. }
8. }
9.
10. namespace Login.DAL
11. {
12. //每成功登陆一次用户,增加10点积分。
13. public class ScoreDAO
14. {
15. public void UpdateScore(string userName, int value)
16. {
17. using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))
18. {
19. SqlCommand cmd = conn.CreateCommand();
20. cmd.CommandText = @"INSERT INTO SCORES(UserName,Score) Values (@UserName,@Score)";
21.
22. cmd.Parameters.Add(new SqlParameter("@UserName", userName));
23. cmd.Parameters.Add(new SqlParameter("@Score", value));
24.
25. conn.Open();
26. cmd.ExecuteNonQuery();
27. }
28. }
29. }
30. }
31.
32. namespace Login.DAL
33. {
34. public class UserDAO
35. {
36. //根据userName和password返回一个布尔值。
37. public Login.Model.UserInfo SelectUser(string userName, string password)
38. {
39. {
40. //有了using以后,connection就可以自动关闭 了
41. SqlConnection conn=new SqlConnection (DbUtil .ConnString );
42. {
43. SqlCommand cmd=conn.CreateCommand ();
44. cmd.CommandText=@"SELECT ID,UserName,Password,Email FROM USERS WHERE UserName=@UserName AND Password=@Password";
45. cmd.CommandType=CommandType .Text;
46. cmd.Parameters.Add(new SqlParameter ("@UserName",userName));
47. cmd.Parameters.Add(new SqlParameter ("@Password",password));
48.
49. conn.Open();
50. SqlDataReader reader = cmd.ExecuteReader();
51.
52. //设置user的默认值为null
53. Login.Model .UserInfo user=null;
54. while (reader.Read())
55. {
56. if (user==null )
57. {
58. //如果user是null的话,则延迟加载
59. user=new Login .Model .UserInfo ();
60. }
61. user.ID=reader.GetInt32(0);
62. user.UserName=reader.GetString(1);
63. user.Password=reader.GetString(2);//not suggestion
64.
65. //如果Email不是null的话,才可以去读。
66. if (!reader.IsDBNull(3))
67. {
68. user.Email=reader.GetString(3);
69. }
70.
71. }
72. return user;
73.
74. }
75. }
76. }
77. }
78. }
2)UI表示层:
添加新项目,Windows窗体应用程序。
名称:LoginUI ,设置为启动项目
默认命名空间:Login.UI
引用:LoginBLL,LoginModel
登陆:btnLogin
用户名:(Name):txtUserName
密码: (Name):txtPassword; PasswordChar:*
窗体: Text:系统登陆; MaximizeBox:False; MinimizeBox:False; FormBorderStyle:FixedSingle
[csharp] view plaincopyprint?
1. namespace LoginUI
2. {
3. public partial class Form1 : Form
4. {
5. public Form1()
6. {
7. InitializeComponent();
8. }
9.
10.
11. private void btnLogin_Click(object sender, EventArgs e)
12. {
13. ////通常,直接使用DAO呼叫数据库。
14. //IDbConnection conn = new SqlConnection("c....");
15. //IDbCommand cmd = conn.CreateCommand();
16. //cmd.CommandText = "Select UserName From USERS WHERE .....";
17. //cmd.ExecuteReader();
18.
19. //利用三层架构,需要引用下一层的
20. string userName = txtUserName.Text.Trim();
21. string password = txtPassword.Text;
22. Login.BLL.LoginManager mgr = new Login.BLL.LoginManager();
23. Login.Model .UserInfo user= mgr.UserLogin(userName, password);
24.
25. MessageBox.Show("登陆用户:"+user.UserName );
26. }
27. }
28. }
3)BLL业务逻辑层:
添加新项目;
名称:LoginBLL
默认命名空间:Login.BLL
添加新类:LoginManager/LoginService服务
引用:LoginDAL,LoginModel
[csharp] view plaincopyprint?
1. namespace Login.BLL
2. {
3. public class LoginManager
4. {
5. public Login.Model.UserInfo UserLogin(string userName, string password)
6. {
7. //throw new NotImplementedException();
8. //呼叫数据源,获取相应数据
9. Login.DAL.UserDAO uDao = new Login.DAL.UserDAO();
10. Login.Model.UserInfo user = uDao.SelectUser(userName, password);
11. if (user != null)//login successful
12. {
13. //如果登陆成功,则增加10点积分。
14. Login.DAL.ScoreDAO sDao = new Login.DAL.ScoreDAO();
15. sDao.UpdateScore(userName, 10);
16. return user;
17. }
18. else
19. {
20. throw new Exception("登陆失败。");
21. }
22. }
23. }
24. }
4)Modle数据模型:
添加新建项目:
名称:LoginModel
默认命名空间:Login.Model
添加类:UserInfo
Model数据模型:是独立于其余层次的,不知道其余层次的信息,其余层次都会引用Model。介于UI和BLL,此处表示我们想要返回的数据为USER对象。
[csharp] view plaincopyprint?
1. namespace Login.Model
2. {
3. public class UserInfo
4. {
5. public int ID { get; set; }
6. public string UserName { get; set; }
7. public string Password { get; set; }
8. public string Email { get; set; }
9. }
10. }
展开阅读全文