【前言】
在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构,这里的分层不是指物理分层,而是指逻辑上的层次。分层的目的是为了实现“高内聚,低耦合”的思想。有利于系统后期的维护、更新或者移植。 通常意义上的三层架构就是将整个业务应用划分为:界面层、业务逻辑层、数据访问层。每一层都职责明确。
【概念】
图片来自网络
界面层(User Interface Layer)
UI层,是整个系统的最外层,和用户直接交互。用于显示数据和接收用户输入的数据。
业务逻辑层(Business Logic Layer)
BL层是系统架构的核心,它处于数据访问层与表示层中间,起到了数据交换中承上启下的作用。
数据访问层(Data Access Layer)
DA层,其功能主要是负责数据库的访问,可以访问数据库系统、二进制文件、文本文档或是XML文档。
简单的说法就是实现对数据表的Select,Insert,Update,Delete的操作。
【实现】
这里以一个简单的登陆系统来说明各层之间的联系,以及三层架构在项目中的使用。首先从B层出发开始设计。
实体层:
namespace Login.Model { public class UserInfo { public int ID { get; set; } public string UserName { get; set; } public string Password { get; set; } } }
BLL
这一层包含业务逻辑,判断用户输入的用户名和密码是否正确。
namespace Login.BLL { public class LoginManager { /// <summary> /// UserLogin方法,包含登陆功能的业务逻辑 /// </summary> /// <param name="username">用户名</param> /// <param name="password">密码</param> /// <returns>UserInfo</returns> public Login.Model.UserInfo UserLogin(string username, string password) { Login.DAL.UserDAO uDao = new Login.DAL.UserDAO(); Login.Model.UserInfo user = uDao.SelectUser(username ,password);//将数据传递到D层 //如果user不为空,则返回user,否则抛出异常登录失败 if (user != null) { return user; } else { throw new Exception("登陆失败!"); } } } }
DAL
这一层实现对数据库的访问,包含数据库的连接,SQL语句等。
namespace Login.DAL { public class UserDAO { public Login.Model.UserInfo SelectUser(string username, string password) { //数据库连接 using (SqlConnection conn = new SqlConnection(@"Trusted_Connection=True;Server=(local); Database=Login")) { SqlCommand cmd = conn.CreateCommand(); cmd.CommandText = @"SELECT ID,UserName,Password FROM USERS WHERE UserName=@UserName AND Password=@Password"; cmd.CommandType = System.Data.CommandType.Text; cmd.Parameters.Add(new SqlParameter("@UserName", username)); cmd.Parameters.Add(new SqlParameter("@Password", password)); conn.Open();//打开连接 SqlDataReader reader = cmd.ExecuteReader(); //根据SQL语句读取数据库 Login.Model.UserInfo user = null; //申明user对象,暂不实例化 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); } return user; } } } }
UIL
实现用户界面设计,通过和用户的交互获取相应的数据,并且给用户相应的反馈信息。
namespace LoginUI { public partial class UserLogin : Form { public UserLogin() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } 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);//调用B层LoginManager类的UserLogin方法,传参 MessageBox.Show("登陆用户为:" + user.UserName); //显示登陆信息 } } }
【规则】
- 系统各层次及层内部子层次之间都不得跨层调用
下图为各层之间的引用关系:这里需要注意不能跨层调用。
- UI层只能作为一个外壳,不能包含任何业务逻辑的处理过程
- UI层和BL层不要出现任何SQL语句
【小结】
任何一件事物都具有两面性,三层架构同样也是,有其优点同样也存在不足的地方。不是任何项目都适合使用三层架构,但是无疑对于大型合作开发项目来说,分层思想是适用的。
优点:
解耦和,降低各层之间的依赖性
开发人员可以只关注整个结构中的其中某一层
使系统易于更新、修改、后期维护
缺点:
降低了系统性能,增加了中间层来控制对数据库的访问,效率自然比直接访问数据库要低
增加了项目的开发成本