C#应用反射:建立一个动态WEB服务来简化代码

ZDNet软件频道 时间:2006-11-08 作者:Builder.com.cn |  我要评论()
本文关键词:Web服务 c# 反射 C#
许多C#开发者应用WEB服务与其业务逻辑进行通信,这样做有许多好处。在构架方面,这种方法有其它方法所没有的一系列灵活性。但是,它也存在一些缺点。

许多开发者应用Web服务与其业务逻辑进行通信,这样做有许多好处。在构架方面,这种方法有其它方法所没有的一系列灵活性。但是,它也存在一些缺点。缺点之一在于保持Web服务方法与业务逻辑方法同步涉及大量繁琐的工作。本文为你说明如何在享受Web服务好处的同时,避免上述同步问题。

推理过程

我最近设计并建立了一个应用程序,它利用Web服务进行业务层通信。其界面应用一个定制的组件来要求数据,定制的组件使用Web服务与业务层进行通信。这样这个界面可配置在我们希望的任何地方,而且可以通过SSL确保所有通信。它的一般构架与A类似。

图A

一般构架

业务逻辑类包含静态方法,可在数据送交到数据访问层前对其进行处理,或通过Web服务返回通信组件。

前两个星期,当我们把它应用于主系统时,这个程序运行良好。但随后,我们开始在业务逻辑中增加越来越多的方法,它们需要通过Web服务来揭示。由于我们要为Web服务和业务逻辑类设定1:1的比例,这一过程要花费大量的时间。每次我们增加一个新业务逻辑类,我们必须建立一个新的Web服务;为Web服务安排代理类;保持代理类与Web服务同步,并保持Web服务与业务逻辑同步。

我们的最后期限很短,时间安排也非常紧。我们需要想出一个办法来自动化或简化与Web服务应用有关的维护过程。互相讨论之后(如代码生成器——我们已使用一个代码生成器从数据库表中生成类),我想出一个主意:使用反射自动调用业务逻辑类中的方法,并通过Web服务返回其结果。半小时后,我建立了第一个原型,约二个小时后,我建成了一个我感觉可用于生产环境中的组件。

安装

让我们假设你已经开发出一些类。这些类可称之为“数据传输对象”(DTO——在这里阅读更多DTO的有关信息)。

  • CustomerData——保存单独客户数据
  • OrderData——保存单独订单数据

我们还建立了以下这些类,它们的任务是与数据访问层进行通信,并移植CustomerDataOrderData对象:

  • Customer——它有两个静态方法,LoadByCustomerID(int customerID)LoadByOrderID(int orderID)。这两个方法都返回单独一个CustomerData对象。
  • Order——它有两个静态方法,LoadByOrderID(int orderID) 和LoadAllForCustomerID(int customerID)。

正常情况下,在这种情形中,会存在两个Web服务——一个返回CustomerData对象,一个返回OrderData对象(你可以把它们结合到一个Web服务中,但当它们处理大量类时会出现堵塞)。这两个Web服务各自有两个方法。程序将从界面层,或像我的例子一样从通信组件中调用Web服务方法。然后Web服务再调用业务层获得所需的数据。因此在正常情况下,每个Web服务获得两个DTO、两个类、两个Web服务和两个方法。(见B

例如

图B

安装

我使用的应用程序有大约100个这样的实例,我们每天都在增加更多实例。很明显,由于时间限制,那不是解决问题的办法。

应用反射,你可以利用一个具有两个方法的Web服务来处理你需要在业务层进行的每一个单独调用。这样你就可以从Web服务与代理类维护工作中解放出来。(见C

例如

图C

反射


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134