一、两层架构
我们之前敲写的机房收费系统,均采用的两层架构,两层架构有如下特点:
1)数据库访问和用户类型判断逻辑放在一起实现。
2)用户界面层直接调用数据访问实现。
3)整个系统功能放在同一项目中实现。
传统的两层结构的特点是用户界面层直接与数据库进行交互,还要进行业务规则、合法性校验等工作。两层结构软件模型如图
这种结构存在着很多局限性,比如:一旦用户的需求发生变化,应用程序都需要进行大量修改,甚至需要重新开发,给系统的维护和升级带来了极大的不便;用户界面层直接访问数据库,会带来很多安全隐患。为了克服两层结构的局限性提出了三层结构
二、三层架构
所谓三层体系结构,是在客户端与数据库之间加入了一个“中间层”,也叫组件层。
三层架构(3-tier application) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。区分层次的目的即为了“高内聚,低耦合”的思想。
其结构如图所示
(1)表现层(UI)
通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得。
如在机房收费系统中,登陆界面就属于UI层
登陆界面代码
<span style="white-space:pre"> </span>private void btnLogin_Click(object sender, EventArgs e) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span> string userName = txtUsername.Text.Trim(); <span style="white-space:pre"> </span> string password = txtPassword.Text; <span style="white-space:pre"> </span> Login.BLL.LoginManager mgr = new Login.BLL.LoginManager(); <span style="white-space:pre"> </span> Login.Model.UserInfo user=mgr.UserLogin(userName, password); <span style="white-space:pre"> </span> MessageBox.Show("登陆用户:"+user.UserName ); <span style="white-space:pre"> </span>}UI作用:如以上代码所示,登陆端不承担访问数据源和处理任何数据的任务,只采集用户输入的信息,将信息传递给业务逻辑层,由业务逻辑层进行处理。
UI设计的原则:用户至上,兼顾简洁。
(2)业务逻辑层(BLL)
针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。
BLL作用:主要承担了承上启下的作用:
1)从DAL中获取数据,以供UI使用
2)从UI中获取用户指令和数据,执行业务逻辑。
3)从UI中获取用户指令和数据,通过DAL写入数据源。
如从登陆界面(UI层)获取登陆用户名和密码后交给BLL层处理数据。
其代码如下
<span style="white-space:pre"> </span>public class LoginManager <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>public Login.Model.UserInfo UserLogin(string username,string password) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>throw new NotImplementedException(); <span style="white-space:pre"> </span>Login.DAL.UserDao uDao = new Login.DAL.UserDao(); <span style="white-space:pre"> </span>Login.Model.UserInfo user= uDao.SelectUser(username, password); <span style="white-space:pre"> </span>if(user !=null) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span> Login.DAL.ScoreDao sDao = new Login.DAL.ScoreDao(); <span style="white-space:pre"> </span> sDao.UpdateScore(username, 10); <span style="white-space:pre"> </span> return user; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>else <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>throw new Exception("登陆失败"); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span> }BLL职责机制:
UI→BLL→UI
UI→BLL→DAL→BLL→UI
(3)数据访问层(DAL)
该层所做事务直接操作数据库,针对数据的增添、删除、修改、更新、查找等。
DAL作用:
从数据源加载、写入、删除数据。
在登陆界面中其代码如下
<span style="white-space:pre"> </span>public class UserDao <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>public Login.Model.UserInfo SelectUser(string userName,string password) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>using (SqlConnection conn = new SqlConnection(DbUntil.ConnString)) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>SqlCommand cmd = conn.CreateCommand(); <span style="white-space:pre"> </span>cmd.CommandText = @"SELECT ID,UserName,Password,Emai FROM USERS WHERE UserName=@UserName AND Password=@Password"; <span style="white-space:pre"> </span>cmd.CommandType = CommandType.Text; <span style="white-space:pre"> </span>cmd.Parameters.Add(new SqlParameter("@UserName", userName)); <span style="white-space:pre"> </span>cmd.Parameters.Add(new SqlParameter("@Password", password)); <span style="white-space:pre"> </span>conn.Open(); <span style="white-space:pre"> </span>SqlDataReader reader = cmd.ExecuteReader(); <span style="white-space:pre"> </span>Login.Model.UserInfo user = null; <span style="white-space:pre"> </span>while (reader.Read()) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>if(user ==null) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>user = new Login.Model.UserInfo(); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>user.ID= reader.GetInt32(0); <span style="white-space:pre"> </span>user.UserName = reader.GetString(1); <span style="white-space:pre"> </span>user.Password = reader.GetString(2); <span style="white-space:pre"> </span>if(!reader.IsDBNull(3)) <span style="white-space:pre"> </span>{ <span style="white-space:pre"> </span>user.Email = reader.GetString(3); <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>return user; <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>} <span style="white-space:pre"> </span>}三层优缺点:
优缺点
1、开发人员可以只关注整个结构中的其中某一层;
2、可以很容易的用新的实现来替换原有层次的实现;
3、可以降低层与层之间的依赖;
4、有利于标准化;
5、利于各层逻辑的复用。
1、降低了系统的性能。这是不言而喻的。如果不采用分层式结构,很多业务可以直接造访数据库,以此获取相应的数据,如今却必须通过中间层来完成。
2、有时会导致级联的修改。这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代码。原文地址:http://blog.csdn.net/zsx701/article/details/42394289