中国.Rick

IT.Man

.net 三层架构【.NET基础学习】

传统两层结构

  在过去应用系统开发过程中,CLIENT/SERVER体系结构得到了广泛的应用 。其特点是,应用程序逻辑通常分布在客户和服务器两端,客户端发出数据资源访问请求,服务器端将结果返回客户端。但CLIENT/SERVER结构存在着很多体系结构上的问题,比如:当客户端数目激增时,服务器端的性能会因为负载过重而大大衰减;一旦应用的需求发生变化,客户端和服务器端的应用程序都需要进行修改,给应用维护和升级带来了极大的不便;大量的数据传输增加了网络的负载等等。

  三层结构介绍

  所谓三层体系结构,是在客户端与数据库之间加入了一个"中间层",也叫组件层。这里所说的三层体系,不是指物理上的三层,不是简单地放置三台机器就是三层体系结构,也不仅仅有B/S应用才是三层体系结构,三层是指逻辑上的三层,一般包含:
 

  • 数据访问层:也叫 DataAccess层、DAL(DataAccess Layer层),这一层的工作就是与数据库或其它文件打交道;
  • 业务逻辑层:也叫中间层,Bussiness Logical layer,也可说是Bussiness Rule(业务规则),这一层是处理业务逻辑的;
  • 外观层:Presentation Layer,这一层主要是与用户打交道,也就是界面。比如是Web,也可能是WinForm.

     

  打个比方来说,你要做一个简单的功能:往数据库里插入一条学生记录

  外观层:只是处理你的界面应该怎么展示,比如控件的布局,还有一个主要的就是把界面上控件内的数据读取下来。这一层主要做的事情,就是从外部获取数据,当然还有一些简单的判断,比如判断那些数据是不能为空的,必须输入,然后调用中间层的一个访问,通过参数的形式转过去。

  中间层的接到从外观屋传来的数据,这里就做业务辑逻的判断。比如判断只有20岁以上的人才能保存在数据库等,反正这里是关心业务的,通过业务逻辑层的数据,就调用数据访问层的方法 。

  数据访问层只做与数据库打交道的工作(也可以是与文件打交道,毕竟保存数据的地方不只有数据库)。数据库访问层不会对业务逻辑做过多的判断,他的任务就是为了把中间层传过来的数据如果保存在数据库中。

  三层框架只是一种思想,就是任务职责的分解。 简单的说,你可以用三个函数(function)来实现, 比如fun1的任务是把界面上的数据读取两个数字中,然后把这两个数据传给fun2,他不管fun2拿这两个数据来干什么的。 fun2的任务就是把这两个数字相减或相加,fun1和fun3是不管的(这一层是的操作是根据你的具体业务来)。第三个fun3的任务就是访问数据库,把fun2操作运算过的一个数字保存到数据库中再大一点,你可以用三个类来分开实现。再大一点来说,你可以建三个不同的项目来实现(企业级架构就是这样的。 
 

        ASP.NET可以使用.NET平台快速方便的部署三层架构。ASP.NET革命性的变化是在网页中也使用基于事件的处理,可以指定处理的后台代码文件,可以使用C#,VB,J#作为后台代码的语言。.NET中可以方便的实现组件的装配,后台代码通过命名控件可以方便的使用自己定义的组件。显示层放在ASP页面中,数据库操作和逻辑层用组件来实现,这样就很方便的实现了三层架构。

                                

 

下面分别就各层的实现举个制作留言簿的小例子。

我们首先在sqlserver数据库中建一个数据库GestDB,在GestDB中建表:Guestbook,如下图:

                        

第一步:打开VS.NET,点击文件-》新建-》空白解决方案,在弹出的新建项目中选择Visal C#项目,模板选择ASP.NET Web应用程序.在位置处给本方案命名为geustbook.如下图所示。
                                   

第二步:建数据库访问控件。单击上图"确定"。在窗口右边的 "解决方案资源管理器"中右击"解决方案"guestbook""选择"添加"->"新建项目",弹出如下窗口,如图模板选择类库,填写名称,位置。注意该类库理论上与留言簿的工程是没有关系的,所以存储位置可以任意。
                                  

第三步:建立逻辑处理层。同第二步,建立另一个控件BusinessLayer。此控件用来调用数据库控件,封装留言簿所有的逻辑处理。如下图所示
                                

第四步:关于引用。因为BUSINESSLAYER要用到系统的WEB控件和刚才建的DBLayer,所以必须把二者添加引用。右键点击BUSINESSLAYER的"引用",选择.NET的"System.web.dll"双击选中即可。
                              

           Web   层    
   
  Web   层为客户端提供对应用程序的访问。这一层是作为   Duwamish.sln   解决方案文件中的   Web   项目实现的。Web   层由   ASP.NET   Web   窗体和代码隐藏文件组成。Web   窗体只是用   HTML   提供用户操作,而代码隐藏文件实现各种控件的事件处理。    
   
  业务外观层    
   
  业务外观层为   Web   层提供处理帐户、类别浏览和购书的界面。这一层是作为   Duwamish.sln   解决方案文件中的   BusinessFacade   项目实现的。业务外观层用作隔离层,它将用户界面与各种业务功能的实现隔离开来。除了低级系统和支持功能之外,对数据库服务器的所有调用都是通过此程序集进行的。    
   
  业务规则层    
   
  业务规则层是作为   Duwamish.sln   解决方案文件中的   BusinessRules   项目实现的,它包含各种业务规则和逻辑的实现。业务规则完成如客户帐户和书籍订单的验证这样的任务。    
   
  数据访问层    
   
  数据访问层为业务规则层提供数据服务。这一层是作为   Duwamish.sln   解决方案文件中的   DataAccess   项目实现的。    
   
  代码示例:    
   
  以下是两种不同处理路径的代码示例:    
   
  获取商品目录    
   
  表示层调用业务外观层:    
   
  productSystem   =   new   ProductSystem();    
   
  categorySet   =   productSystem.GetCategories(categoryID);    
   
  业务外观层直接调用数据层:    
   
  public   CategoryData   GetCategories(int   categoryId)    
  {    
  if   (   dsCommand   ==   null   )    
  {    
  throw   new   System.ObjectDisposedException(   GetType().FullName   );    
  }    
  return   FillCategoryData("GetCategories",   "@CategoryId",   categoryId);    
  }    
   
  添加定单    
   
  表示层调用业务外观层:    
   
  public   void   AddOrder()    
  {    
  ApplicationAssert.CheckCondition(cartOrderData   !=   null,   "Order   requires   data",   ApplicationAssert.LineNumber);    
  ApplicationLog.WriteTrace("Duwamish7.Web.Cart.AddOrder:\r\nCustomerId:   "   +    
  cartOrderData.Tables[OrderData.CUSTOMER_TABLE].Rows[0][OrderData.PKID_FIELD].ToString());    
  cartOrderData   =   (new   OrderSystem()).AddOrder(cartOrderData);    
  }    
   
  业务外观层调用业务规则层:     
    
  public   OrderData   AddOrder(OrderData   order)    
  {    
  ApplicationAssert.CheckCondition(order   !=   null,   "Order   is   required",   ApplicationAssert.LineNumber);    
   
  (new   BusinessRules.Order()).InsertOrder(order);    
  return   order;    
  }     
    
  业务规则层调用数据层:     
    
  public   bool   InsertOrder(OrderData   order)    
  {    
  //此处省略复杂的处理逻辑    
  if   (   isValid   )    
  {    
  using   (DataAccess.Orders   ordersDataAccess   =   new   DataAccess.Orders())    
  {    
  return   (ordersDataAccess.InsertOrderDetail(order))   >   0;    
  }    
  }    
  else    
  return   false;    
  }    

        参考.NET Pet shop 4.0,它是基于三层结构的B/S程序,网上有很多相关的介绍。
     下载地址:http://msdn2.microsoft.com/en-us/library/aa479070.aspx

 

« 上一篇 | 下一篇 »
  • 相关文章:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

日历

最新评论及回复

最近发表

Powered By Z-Blog 1.8 Walle Build 91204 and Theme By BokeZhuti.cn

Copyright RickC.cn [浙ICP备09040539] Some Rights Reserved.