首页 > 代码库 > 三层架构

三层架构

一、两层架构

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

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

三层架构