如何使用spring .net注入wcf代理

时间:2011-06-20 12:05:03

标签: .net wcf spring.net

我是Spring.Net的新手。 我有一个wcf服务类,需要另一个服务的代理,如:

[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();
  }
}

如何通过在Spring.Net的App.config文件中配置service1代理中的service2代理来注入Service2代理?

App.config文件 @bbai请找到下面的app.config文件。我在Program.cs文件中创建ServiceHost。

<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>

  <!-- 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&lt;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&lt;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>

2 个答案:

答案 0 :(得分:1)

在WCF中使用IoC并不简单,但在这种情况下,您可以使用IInstanceProvider在创建服务时解析对IService2的引用。 http://blogs.msdn.com/b/carlosfigueira/archive/2011/05/31/wcf-extensibility-iinstanceprovider.aspx上的帖子有一个使用该接口为WCF服务实现简单IoC容器的示例。

答案 1 :(得分:1)

像这样:

<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>

此处有更多文档:http://www.springframework.net/doc-latest/reference/html/wcf.html