我有一个使用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来完成幕后的工作是最好的方法。
由于
答案 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>