如何在wcf中使用注入

问题描述

| 我有两个类在服务上实现合同,这些类从客户端的工厂消费,如下所示。
[ServiceContract]
public interface MyInterface {
    void DoSomething()
}


public class A : MyInterface {
    public void DoSomething(){
       \"Hi I\'m A\"
    }
}

public class B : MyInterface {
     public void DoSomething(){
         \"Hi I\'m B\"
     }
}

public class MyFactory <TMyInterface> {
     void DoSomething(){
         TMyInterface.DoSomething()
     }
}
客户端必须保持不变。我的问题是如何在服务器端通过使用WCF中的.config文件传递类型参数来选择要使用MyInterface的哪种实现。 我读过其他文章,但我还不了解:(     

解决方法

        可以做到,有几种方法可以做到。 一种可能性是创建一个“路由”服务,该服务将包含客户端始终与之通信的“公用”地址。然后,该路由服务可以基于某些配置将呼叫重定向到适当的“真实”服务。 另一种方法是实际上有一个启动两个服务的进程,但是它们的地址在config中定义。如果使用相同的绑定和相同的合同(这种情况),那么当您想要更改将接收来自客户端的呼叫的服务时,可以“触发器”服务地址。例如,此配置将请求定向到\“ http:// machine-name:8000 / Service \”处的端点到服务A。请注意,由于为这两个服务定义了服务主机,因此实际上您需要一个基础服务B的地址-在这种情况下,我使用的是命名管道,无法通过其他计算机访问。
  <system.serviceModel>
    <services>
      <service name=\"A\">
        <host>
          <baseAddresses>
            <add baseAddress=\"http://machine-name:8000/Service\"/>
          </baseAddresses>
        </host>
        <endpoint address=\"\" binding=\"basicHttpBinding\" contract=\"MyInterface\" />
      </service>
      <service name=\"B\">
        <host>
          <baseAddresses>
            <add baseAddress=\"net.pipe://localhost/ServiceBackup\"/>
          </baseAddresses>
        </host>
        <endpoint address=\"\" binding=\"netNamedPipeBinding\" contract=\"MyInterface\" />
      </service>
    </services>
  </system.serviceModel>
当您想更改B的地址时,然后交换地址。
  <system.serviceModel>
    <services>
      <service name=\"A\">
        <host>
          <baseAddresses>
            <add baseAddress=\"net.pipe://localhost/ServiceBackup\"/>
          </baseAddresses>
        </host>
        <endpoint address=\"\" binding=\"netNamedPipeBinding\" contract=\"MyInterface\" />
      </service>
      <service name=\"B\">
        <host>
          <baseAddresses>
            <add baseAddress=\"http://machine-name:8000/Service\"/>
          </baseAddresses>
        </host>
        <endpoint address=\"\" binding=\"basicHttpBinding\" contract=\"MyInterface\" />
      </service>
    </services>
  </system.serviceModel>
托管程序如下所示:
public static void HostServices()
{
    ServiceHost hostA = new ServiceHost(typeof(A));
    ServiceHost hostB = new ServiceHost(typeof(B));
    hostA.Open();
    hostB.Open();
    Console.WriteLine(\"Press ENTER to close\");
    Console.ReadLine();
    hostA.Close();
    hostB.Close();
}
现在,如果您的服务托管在IIS(网络主机)中,那么会有点困难。由于\“ normal \”激活要求将.svc文件作为端点地址的一部分,并且每个.svc文件都与单个类相关联,因此A的地址应类似于http:// machine-name / services /a.svc,而B的地址应为http://machine-name/services/b.svc。因此,在这种情况下,您需要做的是创建一个自定义ServiceHostFactory,并使用ASP.NET Routes集成为您的服务创建一个.svc-less URL。然后,您将使用与前面的示例类似的方法来确定将激活哪个服务。