2010-04-26 160 views
4

多个wcf服务可能实现相同的服务合同接口吗?实现相同服务合同接口的多个WCF服务

我想要做什么是允许的测试服务是可以互换的真正的服务,并指定配置文件中使用该服务。

例如:

[ServiceContract] 
public interface IUselessService 
{ 
    [OperationContract] 
    string GetData(int value); 
} 

测试实施

public class TestService : IUselessService 
{ 
    public string GetData(int value) 
    { 
    return "This is a test"; 
    } 
} 

房地产类

public class RealService : IUselessService 
{ 
    public string GetData(int value) 
    { 
    return string.Format("You entered: {0}", value); 
    } 
} 
+0

如果您发布的代码,请选中在编辑器中的线,然后点击“代码”按钮(101 010)编辑器工具栏上很好地格式和语法高亮显示这些行。创造一个与众不同的世界!谢谢 – 2010-04-27 05:07:44

回答

4

谢谢你们的答案。我现在有一个适用于我的解决方案,无需将界面放入单独的程序集和GAC中。我没有考虑使用其他项目的界面,只是在同一个项目中使用同一个界面来处理多个服务。

我想要做的是在WCF服务的配置文件中的RealService和TestService之间进行更改,这样客户端就不会知道区别(客户端不必改变其配置以指向不同的.svc文件)。我不确定这是可能的,或者至少如果是这样,它绝对不是直截了当的。

我现在正在做的只是WCF服务的配置文件中同时指定服务,然后我点客户端一个或另一个基于我想要的服务。由于此WCF服务仅供内部使用,并且我们可以控制客户端和服务,所以这不是一个坏的折衷。无论如何,这个解决方案可能更加明确。

这里是配置文件的片段:

<services> 
     <service behaviorConfiguration="WcfService1.Service1Behavior" 
       name="WcfService1.TestService"> 
     <endpoint address="" binding="basicHttpBinding" bindingConfiguration="testBasicHttpBinding" 
      contract="WcfService1.IUselessService">    
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     </service> 
     <service behaviorConfiguration="WcfService1.Service1Behavior" 
       name="WcfService1.RealService"> 
     <endpoint address="" binding="basicHttpBinding" bindingConfiguration="testBasicHttpBinding" 
     contract="WcfService1.IUselessService">    
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     </service> 
    </services> 
4

是的,这不仅是可能的,明确的服务合同接口的设计上的用心之内。

+0

我试过这样做,但得到一个配置错误。 我可能做错了。 我有他们自己的.svc和.svc.cs文件中的每个服务类。 然后我指定我想在服务名称: <服务behaviorConfiguration = “WcfService1.Service1Behavior” NAME = “WcfService1.RealService”> <端点地址= “” 绑定= “basicHttpBinding的” bindingConfiguration = “testBasicHttpBinding” 合同= “WcfService1。IUselessService“> 然后我改变了服务的XML元素的name属性,和母鸡我得到一个运行时错误,原来的服务没有终点。 – 2010-04-26 23:42:00

+0

我想你想引用接口名称在您的配置,而确保两个(全部)实现使用相同的接口 – 2010-04-26 23:56:05

+2

为了能够使用相同的接口,接口必须不仅具有相同的签名(相同的参数),它必须在.NET中相同为了这样做,接口的定义必须放置在一个强大的签名程序集中,并使用GACUtil -i MyInterface.dll放置在GAC中,然后在两个项目中都必须引用该程序集。 – Oleg 2010-04-27 00:07:31

2

如果在单独的程序集中定义IUselessService接口并将其放置在GAC中。这个程序集不应该实现任何东西,只需要定义IUselessService接口和其他一些使用需求作为IUselessService参数的类型。

TestService和RealService都应该实现相同的IUselessService接口。我的意思是你应该为每个服务创建两个额外的项目,然后TestService和RealService将没有类型冲突。