Spring.NET WebServiceProxyFactory - 在运行时交换ServiceUri属性?

时间:2012-12-11 18:13:31

标签: web-services spring.net

我有一个使用Spring.NET for IOC的应用程序,以及它提供的许多其他功能。我现在要解决的问题是如何设置类似于WebServiceProxyFactory的东西来自动代理我想在应用程序中使用的Web服务。此配置适用于单个服务端点。

  <object id="MyServiceClient" type="Spring.Web.Services.WebServiceProxyFactory, Spring.Services">
<property name="ServiceUri" value="https://my.service1.net/service.asmx"/>
<property name="ServiceInterface" value="Sample.IServiceClient1"/>
<property name="WebServiceProxyBaseType" value="Sample.SecureWebServiceProxy, Sample"/>
<property name="MemberAttributes">
  <dictionary>
    <entry key="*">
      <list>
        <object type="System.Web.Services.Protocols.SoapHeaderAttribute, System.Web.Services">
          <constructor-arg value="ServiceAuthenticationHeader" />
          <property name="Direction" value="In" />
        </object>
        <object type="System.Web.Services.Protocols.SoapHeaderAttribute, System.Web.Services">
          <constructor-arg value="ServiceErrorStatus" />
          <property name="Direction" value="Out" />
        </object>
      </list>
    </entry>
  </dictionary>
</property>
<property name="ProductTemplate">
  <object>
    <property name="ServiceAuthenticationHeader" ref="ServiceAuthenticationHeader" />
    <property name="ServiceErrorStatus" ref="ServiceErrorStatus" />
  </object>
</property>

但是,现在我需要根据应用程序中的配置设置处理可能无限数量的端点。配置会告诉我有关服务端点的数量和详细信息,这些端点可以托管在各种URL上,但实现相同的接口。

我无法弄清楚如何配置Spring.NET以允许我交换 ServiceUri ,以便它可以为工厂生成的每个对象进行更改。我会调用Factory的GetObject方法,但想在生成代理对象之前以某种方式指定它应该使用哪个 ServiceUri

目前我认为只需实现一个自定义的IFactoryObject来完成幕后的工作是最好的方法。

由于

1 个答案:

答案 0 :(得分:1)

代理返回一个继承自SoapHttpClientProtocol的实例。 因此,在运行时,您可以使用SoapHttpClientProtocol.Url属性来设置URL。

自定义IFactoryObject可以工作,但前提是您在ProductTemplate属性中指定它:

<property name="ProductTemplate">
  <object>
    <property name="ServiceAuthenticationHeader" ref="ServiceAuthenticationHeader" />
    <property name="ServiceErrorStatus" ref="ServiceErrorStatus" />
    <property name="Url" ref="myFactoryObjectThatReturnsUrl" />
  </object>
</property>