
4)、设计一个更加现实的N层
一般地,我们使用一个或者多个分离的服务器来维持我们正在使用的数据存储,这时,商务逻辑的分布更为分散。下图显示了由两个网络分离的三个机器。可以看出,现在的商务逻辑被分为三个区:一些将和数据存储运行在同一台服务器上,另一些将在中间层服务器上运行,还有一些将在客户机上运行。
由此可以看到,准确定义各个层并不容易。"中间层"的真正意思是商务逻辑本身,并且,商务逻辑的不同元素可以无可非议地存在于不同的服务器中。
3、.Net Framework下的层间(远程)传输对象及技术
.Net Framework实现了许多新的技术以支持多层分布式处理,它提供了丰富的类库、对象及方法使得在不同层(物理上分离或仅仅是逻辑上分离)间的数据传输更为简单。
1)、支持远程数据传送的对象:
ADO.NETDataSet对象
ADO.NET DataTable对象
XmlDocument对象
XmlDataDocument对象
2)、支持远程数据传送的类/方法:
Serialization类
Serialization类描述了一个将数据转换为一种能复制到另一个过程的格式的对象的过程。前面提及的可远程传输的对象具有串行化整个内容的能力,以便它可以通过一个通道来传送。这个通道可以直接通过TCP/IP,或者通过HTTP。当然,它们也可以在另一端解除串行化,因此客户机就得到一个原对象的完整副本。
System.Runtime.Remoting类
System.Runtime.Remoting命名空间提供的对象可用来为对象创建代理以实现远程数据传送。在这种情形下,对象保留在服务器上,并且客户机只收到一个代理对象的引用。这个代理对象表示原来的基于服务器的对象(这就是我们怎样远程使用一个DataReader的方法),示意如下图:
对于客户机,这个代理提供了与原始对象相同的方法和属性。然而,当客户机与代理对象相互作用时,调用被自动串行化,并通过通道(网络)传送给服务器上的对象。然后,任何响应和结果通过通道被传送回客户机。
这两个远程技术都允许客户机使用原来在服务器上创建的对象。我们能够串行化一个DataSet对象或者Xml文档,同时我们也能串行化其它的如集合这样的对象--比如一个哈希表(Hashtable)或数组(Array)。
4、N层模型中的数据处理及对象选择
首先需要考虑的是希望从数据存储中提取出来的数据做些什么?这个问题的答案对我们所使用对象的基本选择的影响将比其他任何事情都要大,甚至在某种程度上定义了我们希望完成任务的性能的种类。
1)、只用于显示的数据
如果只是想以一种固定格式为终端用户显示数据的话,一般来说根本就没有必要远程传输数据。我们没有必要在线上将所有的数据传送给客户机--我们只能传给它们客户设备能接受的任何格式的最终显示信息。
在这种情形中,"Reader"对象提供了一种只读的、仅向前的理想且性能最优的技术。当与能实现服务器端数据绑定的服务器控件一起使用时,我们可以获得一个显示数据的高效方法。
2)、需要远程传输的数据
然而,如果我们需要远程传输数据的话则存在一个问题。这些快速而高效的"Reader"对象只在作为一个引用时才能被远程传输。将一个DataReader作为引用传送给一个客户机时,DataReader仍还在服务器上,不过客户机的应用程序也可以使用它。在这种情况下,我们实际上并没有远程传输数据,而是使用了一个远程传输对象。在很多情况下都存在这种情况。
要实现数据的远程传送,应该将数据寄存到一个能够存储(或保持)数据的对象中。并允许代码不需进入数据存储的额外行程就可以根据需要提取数据,并且多次读取。在ADO.NET中,这个对象就是DataSet对象(或者DataTable对象)。当使用xml时,也有几个对象供选择。我们能够远程传输XmlDocument和XmlDataDocument对象。这两个对象都有保持内容的能力,并且可以在一个应用程序的层之间进行传送。