优化 COM+ 业务逻辑层与表示层之间的交互
通常,分散式应用程序层之间的延迟差异很大。 表示层与业务逻辑层之间的调用通常比业务层与数据层之间的调用慢一个数量级。 因此,调用业务逻辑层时,保留状态的成本更高。
以下主题讨论在表示层和业务逻辑层之间传递数据的方法:
传递参数
对于在表示层和业务逻辑层之间传递的给定信息集,可能有一行、多行或单行(如标头)和多个详细数据行的组合。 在层之间传递此信息的最有效方法是通过单个方法调用。 此单个调用将管理要传递的整个信息集。 这是必要的,除非选择控制表示层中的事务(并使表示层中的所有事务处理在功能上相同)。 Microsoft 不建议从表示层执行事务,因为此层与业务逻辑层之间的调用通常是多层应用程序中任何调用中速度最慢的一次。
创建此类方法的一种方法是将单行信息作为参数传递,并将多行作为 ADO 记录集传递。 记录集是 Microsoft ADO 数据访问方法的核心,使用 ADO 记录集,可以在一个步骤中传递与单个事务相关的所有信息。
数据传递选项
传递数据时需要考虑其他选项。 这包括使用参数列表和 ADO 记录集(如上所述)、ADO 记录集、XML 编码字符串或结构数组。 本部分讨论其中每个选项。
下表显示了在使用四种不同参数传递可能性之一时需要格外小心的方面。 “X”表示需要理解权衡并权衡每个项目的需求的方面。 尽量不要基于每个组件做出参数传递决策。 在整个项目中,一致的编程模型的优势远远超过了在除了最极端的情况外,在每种方法或每个组件的基础上进行优化的任何优势。 这些列在表后面的列表中进行了说明。
并发 | WAN | 部署 | 复杂性 | |
---|---|---|---|---|
条目 | 值 | |||
记录集 |
X |
X |
X |
|
XML |
X |
X |
X |
|
数组 |
X |
X |
X |
这四列定义使用此选项传递参数时要注意的方面。
- 并发列表示需要编写代码或提供一种机制来管理更新操作的锁定条件。 由于执行保存的方法可以表示更新,因此可能会出现并发问题。 两种类型的锁定是普遍的乐观锁定和悲观锁定。 悲观锁可防止用户获取更新数据,而其他用户可能执行更新。 乐观锁定通过避免任何两个用户同时更新同一文档的可能性来支持更多的用户。 乐观锁定调用检查以查看存储的数据与访问数据副本进行修改时的数据匹配。 ADO 记录集为乐观锁定提供自动支持。 涉及单行参数列表的更新方案没有为并发检查提供足够的支持。 XML 遇到同样的问题,因为 XML 数据中不存在锁定感知。
- WAN 列表示在广域网(WAN)上可能存在传输争用的情况。 当 WAN 没有足够的容量来管理任何一次移动的所有数据时,应用程序用户会遇到响应时间延迟。 为了支持乐观并发,断开连接的 ADO 记录集会将两个数据副本从服务器传递到客户端。 客户端使用第二个副本来确定提交更改时传回的最小更新行集。 虽然这会减少从表示层到数据的流量,但第二个副本的额外负载可能很重要。 使用记录集作为传递所有信息的唯一方式,因此,除非更新行集从表示层传回数据层,否则需要在层之间传递两倍的数据。
- 部署列表示当网络调用方和组件端需要特殊技术时与数据传递相关的问题。 例如,使用 ADO 记录集要求 ADO 组件同时存在于客户端和服务器上。 XML 分析程序也必须同时存在于两端,以避免将分析程序编码到应用程序中。
- 复杂性列复杂性列显示了所有四个选项,这是一个偏好,或者可能已经在你的开发组织中建立的先前的编程模型经验。 有些人觉得参数传递很麻烦,觉得给编程问题增加了太多的复杂性。 跟踪正在处理的参数,并将它们全部显示在一个编辑窗口中,可能会造成一些开发人员发现难以管理的逻辑复杂性。
参数传递方法也可以进行权衡,例如:
- 参数可能涉及管理多个参数和参数类型,以及必须决定何时将记录集设为参数。
- ADO 记录集可以将方法参数中的分层关系缩减为一个或两个参数。 这大大简化了编程模型,并支持以后添加列,但也隐藏了信息层次结构。 将信息填充到ADO记录集中,然后提取它,需要知道每列的名称或列顺序。 这种情况可能会增加项目中其他组件或应用程序开发人员的复杂性。
- XML 是对上面提到的隐藏层次结构复杂性的不同解读。 程序员需要了解使用 XML 解析器来访问信息,并且通常必须知道数据集中每个项的名称,然后才能找到数据集。
- 结构数组引入了对调用方和组件传递的信息进行共同理解的必要性。 这种对两个系统元素之间共享的映射的需求可能会导致在处理不同版本的组件时遇到困难。 虽然方法签名可能不会更改,但对预期信息的更改可能会导致调用程序不兼容。
由于与所有四种参数传递方法相关的复杂性问题非常相似,因此是否存在与任何一种选择相关的重大简化机会是值得商榷的。
使用工厂模式传递数据
一个重要的设计要点是易于使用。 当决定使用 ADO 记录集将一组结构化的详细信息传递回表示层时,就引入了一个复杂性问题。 表示层程序员需要了解这些记录集的结构。 当需要在记录集中传递一组数据的多个详细信息时,可能会出现更复杂的问题。 为了简化问题,当打算要求在结构化 ADO 记录集中传递数据时,应该考虑创建一个记录集工厂方法。
记录集工厂应向调用者返回空但可写的已断开的记录集。 此记录集应该已经配置了适当的字段(名称和数据类型),这样调用客户端就不需要知道如何生成记录集。 这种方法通常被称为工厂模式,是一种常见的解决方案模式,它解决了创建给定复杂度的对象的需要,而不必知道创建对象的细微差别。
简单的设计选择,例如在传递信息的每个方法中为相同的数据段选择相同的参数名称,可以很容易地查看方法并了解预期内容。 确保在整个方法族中传递类似参数的顺序是一致的,这提供了一个舒适点,可以强制执行一致的模型。