代码改变世界

.net企业级架构实战之6——Spring.net管理web services

2008-11-21 12:14  莫耶  阅读(3599)  评论(3编辑  收藏  举报

   先引用一段spring.net framework帮助文档里的话:

  “虽然目前.NET对web服务支持的非常好,Spring.NET认为还是有几个方面可以改进。

. 服务端

首先,.NET在.asmx文件中保存Web服务请求和服务对象的关联关系,这些.asmx文件不管有用没用都得放在那儿。

第二,Spring.NET希望能通过IoC容器对web服务进行依赖注入。一般说来web服务总会依赖其它服务对象,所以,如果能用配置方式来选择服务对象,这个功能就相当强大了。

最后,目前在.NET中Web服务的创建完全是一个实现(特定类型)的过程。多数服务(虽不能说是全部)都应实现为使用粗粒度服务接口的普通类型,并且,某个对象能否发布为远程对象、web服务还是企业(COM+)组件应该只与配置有关,而不应该取决于它的实现方式。

.消除对.asmx文件的依赖

ASP.NET用.aspx文件来保存表示层代码,用code-behind文件中的类保存应用逻辑,.aspx与类代码文件各有分工;但web服务却不同,Web服务的逻辑完全是在code-behind的类中实现的。.asmx文件并没有什么真正的用途,实际上,这个文件既没有必要存在、也不应该存在。

在将WebServiceFactoryHandler类注册为响应*.asmx请求的HTTP Handler之后,开发人员就可以在IoC容器中用标准的Spring.NET对象定义来发布Web服务。

  ◆欧克,意思说得很明白,在web.config中注册一个httpHandlers节,以接管.asmx请求:

web.config

  ◆既然不存在也不需要物理文件.asmx了,那就需要使用web services代理,来模拟.asmx页,这就是Spring.Web.Services.WebServiceExporter类的工作,它能显式导出web services。
举例说明一下:现有一个web services——SongSrvService(是一个类),它有一个方法GetSongUrl,用以获取一首曲子的地址,如果要把它导出为web services,应为此建立一个配置,并在spring.net环境中加载它:

 

servicesConfig.xml

 

web.config


这里,看一下services运行的截屏:  

  可以看到,在WebServiceExporter导出类配置的节信息,都会忠实地显示在services描述中。如Description(描述)、MemberAttributes(方法描述)等。

  ◆欧克,回溯一步,我们来看看这个被代理导出的web services实现类,应该是什么样子?
在spring.net 1.1.0.2中,如果要让一个类被显式导出为web services,那么,它首先应该是实现某个接口的,意即——它的功能,全在一个接口被描述过。

  在bll层新建一个SongServices类,其中包括一个services接口和一个实现类:

 

SongServices.cs

 

  欧克,这就是Spring.net建议的web services管理方式。小结一下:
1、这种方式,省掉了一个.asmx页面;
2、整合了其他的spring.net下的对象,如方便了注入、拦截;
3、开发难度并未增加,图示说明: