三层架构

来源:互联网 发布:中南大学教务网络平台 编辑:程序博客网 时间:2024/05/18 00:03

一、两层架构

我们之前敲写的机房收费系统,均采用的两层架构,两层架构有如下特点:

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、有时会导致级联的修改。这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代码。
1 0