代码改变世界

艾伟_转载:使用AOP动态调用WebService

2011-08-29 00:21  狼人:-)  阅读(399)  评论(0编辑  收藏  举报

    在网上搜了一下“动态调用WebService”相信都能搜出上千篇文章,但是都出自同一个版本:使用ServiceDescriptionImporter导入wsdl然后进行动态编译,再调用相应的Method返回值。这种方法不足之处就是编译的时候可能会有些慢,毕竟是编译整个WebService,而且前台都是使用同一个方法传入调用的方法来进行调用的。再者,如果使用了Model,引用了WebService后的Model并非此Model,而且如果是List的话,那更差之千里了,返回的只能是数组。
    本人经过思考,用AOP的原理实现了WebService的动态调用,实际上,是调用接口类的方法,然后使用反射得到该方法的返回值,参数等,然后再构造一个WebService的代理类,动态编译后调用返回值。接下来将一一介绍。
    首先定义一个WebService如下。其中使用了FaibClass.Data数据框架。

Code

    客户端也定义一个与之相似的类,暂将它称为接口类,因为它并不实现操作,只是为AOP调用提供方法信息,但是返回值都为null,即不操作。

Code

    前台调用如下:

Code

    下面将一一对每个类进行说明。
    一、自定义代理属性 DynamicWebServiceAttribute。 

Code

    客户端还要为每一个WebService定义一个DynamicWebServiceAttribute的继承类,如

Code

    就是ATest上的那个特性,该类再在app.config里定义相应的webservice调用参数,后面再介绍。这里的Match你可能发现了,就是webservice里方法名与ATest里的匹配方式。
    二、代理处理类 AspectDynamicWebServiceProxy 核心就在这里了

Code

    在invoke中,拦截了ATest的调用方法,DyamicCallWebService进行分析并构造WebServicw的代理类代码,这里使用了缓存,第一次调用 方法都要经过编译,以后就不用了。
    三、配置类
DynamicWebServiceSectionHandler

Code
DynamicWebServiceConfiguration
Code
DynamicWebServiceDictionary
Code
DynamicWebServiceSettings
Code

    ap.config配置如下

Code