关于如何理解三层结构

一直对于这个知识点不明就理,只知道是外观层,业务逻缉层,数据层分离开来的一种实现方法,下午在CSDN上对这个知识点进行了一下搜索,好多贴子都贴出了对于三层的理解,把其中的一此摘录下来,好好琢磨。

------ foolnet(foolnet) --------

对于典型的三层应用系统,分为数据库层,应用服务层,用户界面层,如下所示:
                           
用户界面 <===> 应用服务层 <===> 数据库

很多地方把应用服务层叫做业务逻辑层,这里参考孙亚民的《Websharp中间件及开发工具开发使书》把这个层次叫做应用服务层,为的是在N层体系结构中继续再分的应用服务层有一个层次叫业务逻辑层。
     在应用服务层要处理数据访问以及数据库的持久化,业务逻辑的处理,数据的表示,和业务外观的提供,所以一般会在应用服务层继续分为数据访问层,业务规则层,业务外观层,这就是一个比较经典的的N层体系结构(在petshop和duwarmish中也是这样分的)。
如果按照这个N层来设计架构的话,比如对于用户(User)的操作,一般从低到上有一下的几个类,分别是UserEntity、DataUser(UserDAO)、 BusinessUser、UserSystem(业务外观层)、还有User的表示层。

还可以继续讨论这个问题,如果从另外的一个角度来看分层的体系,可以分为物理模型和逻辑模型。物理模型是从一个系统的硬件和网络来看层次的,如果一个系统有一个数据库服务器和一个Web服务器(分别放在两台计算机上),还有若干的客户机,那么这个系统的物理模型就是三层的,这和上面说的“典型的三层应用系统”情景一致,很多的教科书说的三层也指的是这个。逻辑模型更从软件的逻辑上来分,更从程序员的角度来看软件的结构,一般会在应用服务层细化出更多的逻辑层次,比如
上面的分的N层体系就是一个常见的逻辑模型。一般来说逻辑模型的层次要比物理模型的层次要多,体会一下就会得出这个结论。
 
   
N层结构图,类似ISO网络协议的7层结构,下层为上层提供服务(提供接口),上层是下层的消费者,当前层之于相邻层交换数据,这里比较重要的就是数据是如何表示的,一般是采用一个对象,这里把他叫做实体。实体数据的传递可以分为本地的和分布式的两种情况,也可以叫做进程内的和进程外的的实体传递。
进程内的数值的传递,在.net的数据类型中,分为值类型和引用类型,值类型传递的时候其实是拷贝一个数据,在一次传递有两个地址,两个值;引用类型传递的时候其实是传递一个指针,具体的值只有一个。
在进程外(分布式)实体数据的传递也分为按值传递和按引用传递,在.net框架下的Remoting(或者是Web service)的相关文档对此有比较多的介绍。按引用传递的时候,对象总是在原有的进程之中,如果客户要使用这个对象的时候必须用“引用”的方式,在.net中一般是使用代理来使用引用传递。按值传递则是从一个进程拷贝了一个副本到另外的一个进程,使得原来和当前的进程各自有一个数据对象,在.net中如果是的对象可以跨进程复制,则必须使用序列化这个属性,默认的对象是不可以跨进程传递的。
这里假设有这样的一种情况,客户端是一个WinForm,现在要处理用户登陆这个过程,在服务器上有数据库,服务是WebService或者是Remoting,有一个BusinessUser这个类发布服务,客户端为了使用BusinessUser的Login(string name,string pwd)方法,并不是在客户端创建一个BusinessUser对象,而是使用服务器端的BusinessUser对象(BusinessUser对象容然在服务器进程中),为了使用BusinessUser对象一般是创建一个代理,这是引用方式的。
如果客户端需要获取一个订单的信息,并且这个订单用Order类表示,这个时候需要把Order类复制到客户端,然后显示给用户,那么这个Order就是按值传递的。客户端得到了一个Order的副本,然后Order就可以和本地的对象交互,这就避免了调用对象属性或者方法的开销,不过这样就加大了网络传输的开销,特别传输DataSet这样的大的对象时。

在分布式体系中,对于在什么时候需要使用按引用和按值传递,需要在设计的时候考虑,一般表示业务处理的用引用的方式,表示持久化对象的用按值传递的方式,在Websharp中的实体(或者叫持久化对象)的表示,一般来说是跨进程的按值传递的数据对象。


一些更详细的可以查看http://www.cnblogs.com/foolnet

posted @ 2005-05-22 17:21  shipfi  阅读(726)  评论(1编辑  收藏