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

   先引用一段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请求:

ContractedBlock.gif ExpandedBlockStart.gif web.config
<httpHandlers>
<add verb="*" path="*.asmx" type="Spring.Web.Services.WebServiceHandlerFactory, Spring.Web"/>
</httpHandlers>

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

 

ContractedBlock.gif ExpandedBlockStart.gif servicesConfig.xml
<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net"
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation
="http://www.springframework.net http://www.springframework.net/xsd/spring-objects.xsd"
>
  
  
<!--web services-->
  
<object id="SongSrvService" type="woodigg.bll.Services.SongServices, woodigg.bll">
    
<property name="Message" value="Test Message" />
    
<property name="SongDaoSpring" ref="SongDaoSpring" />
  
</object>
  
  
  
<!--代理对象-->
  
  
<object id="SongSrv" type="Spring.Web.Services.WebServiceExporter, Spring.Web">
    
<property name="TargetName" value="SongSrvService"/>
    
<property name="Namespace" value="http://haphere.com/"/>
    
<property name="Description" value="My exported HelloWorld web service"/>
    
<property name="Name" value="My exported HelloWorld web service"/>    
    
<property name="MemberAttributes">
      
<dictionary>
        
<entry key="GetSongUrl">
          
<object type="System.Web.Services.WebMethodAttribute, System.Web.Services">
            
<property name="Description" value="My Spring-configured HelloWorld method."/>           
          
</object>
          
</entry>
        
</dictionary>
        
</property>
    
</object>
  
</objects>

 

ContractedBlock.gif ExpandedBlockStart.gif web.config
    <!-- Spirng.Net 配置 -->
    
<spring>
        
<context>
            
            
<resource uri="~/config/serviceConfig.xml"/>
        
</context>
        
<objects xmlns="http://www.springframework.net"/>
    
</spring>


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

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

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

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

 

ContractedBlock.gif ExpandedBlockStart.gif SongServices.cs
using System;
using System.Web;
using System.Collections;
using woodigg.model;
using woodigg.Interface.DAO;

namespace woodigg.bll.Services
{
    
public interface ISongServices
    {
        
string GetSongUrl(int id);
    }

    
public class SongServices : ISongServices
    {
        
/// <summary>
        
/// 注入的工具类
        
/// </summary>
        private ISongDAO _SongDaoSpring;
        
public ISongDAO SongDaoSpring
        {
            
get { return _SongDaoSpring; }
            
set { _SongDaoSpring = value; }
        }

        
private string message;        
        
public string Message
        {
            
set { message = value; }
        }   

        
public SongServices() { }

        
/// <summary>
        
/// web services之GetSongUrl
        
/// </summary>
        
/// <param name="id">song id</param>
        
/// <returns>url</returns>
        public string GetSongUrl(int id)
        {
            SONG sg 
= SongDaoSpring.LoadFromId(id);
            
if (sg != null)
                
return woodigg.DAO.Tool.ParameterFactory.WebUploadMusicDomain + sg.Url.ToString();
            
else
                
return string.Empty;
        }
    }
}

 

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

转载于:https://www.cnblogs.com/moye/archive/2008/11/21/1338313.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值