1、三层架构,通常意义上的三层架构就是将整个业务应用划分为:表现层(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)
2、从数据源删除数据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、数据模型的引入: 为了避免三层之间的互相引用,所以
3、出现Model,用于传输数据的,业务数据模型 三、系统登陆实例,步骤: 1、新建数据库 (名称)LoginDemo,包含两张表: 新建表Users 其中,设定ID为主键,自增长。 新建表Scores 其中,设定ID为主键,自增长。 2、编码阶段: 解决方案名称:LoginSolution 位置:LoginDemo 1)DAL数据访问层: 新建项目名称:LoginDAL 默认命名空间:Login.DAL 添加类:UserDAO,ScoreDAO,DbUtil
4、 引用: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. }
5、 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.
6、 { 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.
7、 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.
8、 { 36. //根据userName和password返回一个布尔值。 37. public Login.Model.UserInfo SelectUser(string userName, string password) 38. { 39. { 40. //有了using以后,connection就可以自动关闭 了 41. SqlConnection conn=new SqlConnection (DbUtil .C
9、onnString ); 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 .T
10、ext; 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();
11、 51. 52. //设置user的默认值为null 53. Login.Model .UserInfo user=null; 54. while (reader.Read()) 55. { 56. if (user==null ) 57. { 58.
12、 //如果user是null的话,则延迟加载 59. user=new Login .Model .UserInfo (); 60. } 61. user.ID=reader.GetInt32(0); 62. user.UserName=reader.GetString(1); 63.
13、 user.Password=reader.GetString(2);//not suggestion 64. 65. //如果Email不是null的话,才可以去读。 66. if (!reader.IsDBNull(3)) 67. { 68. user.Email=reader.GetString(3); 69.
14、 } 70. 71. } 72. return user; 73. 74. } 75. } 76. } 77. } 78. } 2)UI表示层: 添加新项目,Windows窗体应用程序。 名称:LoginUI ,设置为启动项目 默认命名空间:Login.UI
15、引用: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 F
16、orm1 : Form 4. { 5. public Form1() 6. { 7. InitializeComponent(); 8. } 9. 10. 11. private void btnLogin_Click(object sender, EventArgs e) 12. { 13. ////通常,直接使用DAO呼叫数据库。 14. //IDbConne
17、ction 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
18、 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.User
19、Name ); 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.
20、{ 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.
21、 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.
22、 sDao.UpdateScore(userName, 10); 16. return user; 17. } 18. else 19. { 20. throw new Exception("登陆失败。"); 21. } 22. } 23. } 24. }
23、 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. }






