2010-04-26 204 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將沒有類型衝突。