I'm new to Spring.Net. I have one wcf service class which needs the proxy of another service like:
[ServiceContract]
Interface IService1{
[OperationContract]
void show();
}
[ServiceContract]
Interface IService2{
[OperationContract]
void show();
}
class Service1:IService1
{
public IService2 Service2
{
get;set;
}
public void Show()
{
Service2.Show();
}
}
How do I inject the proxy of service2 inside the Service1 proxy by configuring it in App.config file in Spring.Net?
App.config file @bbai Please find the below app.config file. ServiceHost im creating inside my Program.cs file.
<sectionGroup name="spring">
<section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
<section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core"/>
</sectionGroup>
<object id="Service1Obj" singleton="false"
type="MyNamespace.Service1, MyAssembly">
<!-- Setter injection-->
<property name="Service2" ref="Service2"/>
</object>
<object id="Service2Obj" singleton="false"
type="MyNamespace.Service2, MyAssembly">
</object>
<!--开发者_如何学JAVA Creating Client side proxy dynamically-->
<object id="Service1"
type="MyNamespace.IService1, MyAssembly"
factory-object="Service1ChannelFactory"
factory-method="CreateChannel" />
<object id="Service1ChannelFactory"
type="System.ServiceModel.ChannelFactory<MyNamespace.IService1>, System.ServiceModel">
<constructor-arg name="endpointConfigurationName" value="Service1Endpoint" />
</object>
<object id="Service2"
type="MyNamespace.IService2, MyAssembly"
factory-object="Service2ChannelFactory"
factory-method="CreateChannel" />
<object id="Service2ChannelFactory"
type="System.ServiceModel.ChannelFactory<MyNamespace.IService2>, System.ServiceModel">
<constructor-arg name="endpointConfigurationName" value="Service2Endpoint" />
</object>
</objects>
<service name="Service2Obj" behaviorConfiguration="DefaultBehavior">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8001"/>
</baseAddresses>
</host>
<endpoint address=""
binding="basicHttpBinding"
contract="MyNamespace.IService2" />
<endpoint address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="DefaultBehavior">
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="True"/>
</behavior>
</serviceBehaviors>
</behaviors>
<client>
<!--<endpoint name="serverWebCalculatorEndpoint" address="http://localhost:2637/Spring.WcfQuickStart.ServerWeb/Calculator.svc" binding="basicHttpBinding" bindingConfiguration="basicHttpBinding1" contract="Spring.WcfQuickStart.ICalculator"/>-->
<endpoint name="Service1Endpoint" address="http://localhost:8000" binding="basicHttpBinding" bindingConfiguration="" contract="MyNamespace.IService1"/>
<endpoint name="Service2Endpoint" address="http://localhost:8001" binding="basicHttpBinding" bindingConfiguration="" contract="MyNamespace.IService2"/>
</client>
Like this :
<objects xmlns="http://www.springframework.net"
xmlns:wcf="http://www.springframework.net/wcf">
<!-- Service2 proxy -->
<wcf:channelFactory id="Service2"
channelType="MyNamespace.IService2, MyAssembly"
endpointConfigurationName="Service2Endpoint" />
<!-- Service 1 -->
<object id="Service1" type="MyNamespace.Service1, MyAssembly" singleton="false">
<property name="Service2" ref="Service2" />
</object>
</objects>
More documentation here : http://www.springframework.net/doc-latest/reference/html/wcf.html
Using IoC in WCF isn't straightforward, but in this case you can use an IInstanceProvider
to resolve the reference to IService2 when the service is being created. The post at http://blogs.msdn.com/b/carlosfigueira/archive/2011/05/31/wcf-extensibility-iinstanceprovider.aspx has an example of using that interface to implement a simple IoC container for a WCF service.
精彩评论