许多开发者应用Web服务与其业务逻辑进行通信,这样做有许多好处。在构架方面,这种方法有其它方法所没有的一系列灵活性。但是,它也存在一些缺点。缺点之一在于保持Web服务方法与业务逻辑方法同步涉及大量繁琐的工作。本文为你说明如何在享受Web服务好处的同时,避免上述同步问题。
推理过程
我最近设计并建立了一个应用程序,它利用Web服务进行业务层通信。其界面应用一个定制的组件来要求数据,定制的组件使用Web服务与业务层进行通信。这样这个界面可配置在我们希望的任何地方,而且可以通过SSL确保所有通信。它的一般构架与图A类似。
图A
一般构架
业务逻辑类包含静态方法,可在数据送交到数据访问层前对其进行处理,或通过Web服务返回通信组件。
前两个星期,当我们把它应用于主系统时,这个程序运行良好。但随后,我们开始在业务逻辑中增加越来越多的方法,它们需要通过Web服务来揭示。由于我们要为Web服务和业务逻辑类设定1:1的比例,这一过程要花费大量的时间。每次我们增加一个新业务逻辑类,我们必须建立一个新的Web服务;为Web服务安排代理类;保持代理类与Web服务同步,并保持Web服务与业务逻辑同步。
我们的最后期限很短,时间安排也非常紧。我们需要想出一个办法来自动化或简化与Web服务应用有关的维护过程。互相讨论之后(如代码生成器——我们已使用一个代码生成器从数据库表中生成类),我想出一个主意:使用反射自动调用业务逻辑类中的方法,并通过Web服务返回其结果。半小时后,我建立了第一个原型,约二个小时后,我建成了一个我感觉可用于生产环境中的组件。
安装
让我们假设你已经开发出一些类。这些类可称之为“数据传输对象”(DTO——在这里阅读更多DTO的有关信息)。
我们还建立了以下这些类,它们的任务是与数据访问层进行通信,并移植CustomerData和OrderData对象:
正常情况下,在这种情形中,会存在两个Web服务——一个返回CustomerData对象,一个返回OrderData对象(你可以把它们结合到一个Web服务中,但当它们处理大量类时会出现堵塞)。这两个Web服务各自有两个方法。程序将从界面层,或像我的例子一样从通信组件中调用Web服务方法。然后Web服务再调用业务层获得所需的数据。因此在正常情况下,每个Web服务获得两个DTO、两个类、两个Web服务和两个方法。(见图B)
例如:
图B
安装
我使用的应用程序有大约100个这样的实例,我们每天都在增加更多实例。很明显,由于时间限制,那不是解决问题的办法。
应用反射,你可以利用一个具有两个方法的Web服务来处理你需要在业务层进行的每一个单独调用。这样你就可以从Web服务与代理类维护工作中解放出来。(见图C)
例如:
图C