三层架构是什么
三层架构(3-tier architecture)通常意义上就是将整个业务应用划分为:显示层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。区分层次的目的主要是为了“高内聚低耦合”的思想。
何时用
当业务复杂和数据存储单独存在时,需要将分层来编写程序
怎么用
拿一个小小的Demo来举例说明简单的运用
private void btnLogin_Click(object sender, EventArgs e) { string Username = txtUsername.Text.Trim(); string Password = txtPassword.Text; Login.BLL.LoginManager mgr = new Login.BLL.LoginManager(); Login.Model.UserInfo user = mgr.UserLogin(Username, Password); MessageBox.Show("登录用户:" + user.Username); }
从DAL中获取数据,以供UI显示用
从UI中获取用户指令和数据,执行业务逻辑
从UI获取用户指令和数据通过DAL写入数据源
namespace Login.BLL { public class LoginManager// 业务逻辑层引用 数据访问层和实体层 { public Login.Model .UserInfo UserLogin(string Username, string Password) { DAL.UserDAO uDao = new Login.DAL.UserDAO(); Login.Model .UserInfo user = uDao.SelectUser(Username, Password); if (user != null) { Login.DAL.ScoreDAO sDao = new Login.DAL.ScoreDAO(); sDao.UpdateScore(Username, 10); return user; } else { throw new Exception("登录失败"); } } } }
从数据源加载数据(Select)
向数据源写入数据(Insert/Update)
从数据源删除数据(Delete)
namespace Login.DAL { class DbUtil { // 连接 sql 数据库 public static string ConnString = @"Server=XULU;Database=Login;User ID=sa;Password=123456"; //public static string ConnString = @"Data Source=.; Initial Catalog = dataBase; Integrated Security = true;"; } }
namespace Login.DAL { public class ScoreDAO { public void UpdateScore(string Username,int value ) { using (SqlConnection conn=new SqlConnection (DbUtil.ConnString )) { SqlCommand cmd = conn.CreateCommand(); cmd.CommandText = @"Insert into Scores(Username,Score)Values(@Username,@Score)"; cmd.Parameters.Add(new SqlParameter("@Username", Username)); cmd.Parameters.Add(new SqlParameter("@Score", value)); conn.Open(); cmd.ExecuteNonQuery(); } } } }
namespace Login.DAL { public class UserDAO { public Login .Model .UserInfo SelectUser(string Username,string Password) { using (SqlConnection conn=new SqlConnection(DbUtil .ConnString)) { SqlCommand cmd = conn.CreateCommand(); cmd.CommandText = @"SELECT ID ,Username,Password,Email From Users Where Username=@Username and Password =@Password"; cmd .CommandType =CommandType .Text ; cmd .Parameters .Add (new SqlParameter ("@Username",Username )); cmd.Parameters.Add(new SqlParameter("@Password", Password)); conn.Open(); SqlDataReader reader=cmd .ExecuteReader (); Login .Model .UserInfo user=null ; while (reader.Read ()) { if (user ==null ) { user=new Login .Model .UserInfo (); } user .ID =reader .GetInt32 (0); user.Username =reader .GetString (1); user .Password =reader .GetString (2); if (!reader .IsDBNull (3)) { user .Email =reader .GetString (3); } } return user ; } } } }
贯穿于上面三层,他的作用就是在三层之间传递数据,这是面向对象的编程模式,
例子中:
DAL的一个insert方法,需要传递Username、Password、Email等三个参数,使用实体层,那么传递的参数就只有一个User类,这样的好处就是减少系统出错的可能,提高开发效率~~
新建一个Model 层,专门存放数据模型。主要是为业务逻辑层服务,但有是数据访问层数据存放。具体归为那一层,具业务流程情况而定Model层是不会引用任何层级的,但是其他三个层级都会引用Model中的实体
namespace Login.Model { public class UserInfo { public int ID { get; set; } public string Username { get; set; } public string Password { get; set; } public string Email { get; set; } } }
生活中的三层
就餐餐馆顾客,服务员 ,厨师,采购人员
显示层就像饭店服务员,直接和客户打交道,提供软件系统与用户交互的借口;业务逻辑层是显示层和数据访问层之间的桥梁,负责数据处理和传输,就像饭店的厨师,负责把采购回来的食品加工完成,传递给服务员,数据访问层只负责数据的存取工作,雷士饭店的采购,系统里有什么数据取决于数据访问层的工作,饭店能够提供什么样的饭菜首先取决于采购购买的材料
小结