Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在wcf中使用注入_Wcf - Fatal编程技术网

如何在wcf中使用注入

如何在wcf中使用注入,wcf,Wcf,我有两个类在一个服务中实现一个契约,它们是从客户机上的工厂消费的,如下所示 [ServiceContract] public interface MyInterface { void DoSomething() } public class A : MyInterface { public void DoSomething(){ "Hi I'm A" } } public class B : MyInterface { public void

我有两个类在一个服务中实现一个契约,它们是从客户机上的工厂消费的,如下所示

[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()
     }
}
[服务合同]
公共接口MyInterface{
无效剂量测定法()
}
公共类A:MyInterface{
公共无效剂量测定法(){
“嗨,我是
}
}
公共类B:MyInterface{
公共无效剂量测定法(){
“嗨,我是B”
}
}
公共类工厂{
无效剂量测定法(){
TMyInterface.DoSomething()
}
}
客户机必须保持不变。我的问题是,如何通过在WCF中使用.config文件传递类型参数,在服务器端选择使用哪个MyInterface实现


我读了另一篇文章,但我还不明白:(

这是可能的,有几种方法可以做到

一种可能是创建一个“路由”服务,该服务将包含客户端始终与之对话的“公共”地址。然后,该路由服务可以根据某些配置将调用重定向到适当的“真实”服务

另一种方法是让一个进程启动这两个服务,但它们的地址是在配置中定义的。如果使用相同的绑定和相同的契约(这种情况下),则可以“触发器”要更改将接收来自客户端的调用的服务时的服务地址。例如,此配置将请求定向到位于“”的端点http://machine-name:8000/Service"注意,由于您为这两个服务定义了服务主机,所以实际上还需要为服务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>

现在,如果您的服务托管在IIS(webhost)中,那么就有点难了激活需要一个.svc文件作为端点地址的一部分,并且每个.svc文件都与一个类相关联,a的地址类似,B的地址类似。因此,在这种情况下,您需要创建一个自定义ServiceHostFactory,并使用ASP.NET Routes集成来创建您的服务的vc-less URL。然后,您可以使用类似于上一个示例的内容来决定将激活哪个服务。

图片中的WCF在哪里?MyInterface是服务合同吗?您是尝试在客户端还是服务器上调用MyFactory.DoSomething?MyFactory必须是来自我的客户端的服务合同,我只想调用工厂和服务负责根据其配置解析和使用实现,因此您不想更改客户端代码或配置,而是根据服务器配置更改在服务器端调用的类?是的,这是我的目标,我的客户端可能总是相同的。我只想在服务器端配置。有什么想法吗感谢您的回答,我将尝试实现您的想法,稍后再发布我的结果,但为我找到了一个好的解决方案谢谢!!!:)
  <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();
}