2011-06-25 41 views
4

我能請得到暴露我的業務對象複雜的WCF服務的一些澄清。比方說,我有4個對象:contactorganisationprojectletterWCF多個合同

是創造我的服務最好的辦法:

  1. 讓4個合約爲「服務對象」,並通過對象和預期的操作值/參數中的「服務對象」?或
  2. 爲所有對象及其功能(可能很多)創建合同?

非常感謝,

克里斯

+0

問這個問題的原因,目前我有一個名爲contact_function1,contact_function2 ..... organisation_function1,organsiation_function2和我的服務文件變得相當長的服務中的所有功能。 –

回答

8

按照Interface Segregation Principle,你可能要考慮一下那些分裂的東西了。

一個典型的方法是將每個對象類型有一個接口(例如,一個「服務」) - 例如一個用於Contact的接口,包含所有需要的和對聯繫人有用的操作等。

當然,您可能也有處理多種不同類型對象的方法 - 這些方法對於放置在特定服務合約中有點棘手。

而且,與WCF,您可以輕鬆擁有一個單一的服務實現類,然後又將實現一次這些接口的多 - 例如使用通用代碼或通用模式。

但我想這將是重新考慮你的服務合同,將其轉換成更小,更易管理的塊是個好主意。

更新:

如果你的服務實現類實現四個服務合同,那麼你就必須配置它是這樣的:

<services> 
    <service name="YourNamespace.YourServiceImplementation"> 
    <host> 
     <baseAddresses> 
      <add baseAddress="http://YourServer/MyServices/" /> 
     </baseAddresses> 
    </host> 
    <endpoint name="Contact" 
     address="Contact" 
     binding="basicHttpBinding" 
     contract="YourNamespace.IContactService" /> 
    <endpoint name="Letter" 
     address="Letter" 
     binding="basicHttpBinding" 
     contract="YourNamespace.ILetterService" /> 
    <endpoint name="Organisation" 
     address="Organisation" 
     binding="basicHttpBinding" 
     contract="YourNamespace.IOrganisationService" /> 
    <endpoint name="Project" 
     address="Project" 
     binding="basicHttpBinding" 
     contract="YourNamespace.IProjectService" /> 
    <endpoint name="mex" 
     address="mex" 
     binding="mexHttpBinding" 
     contract="IMetadataExchange" /> 
    </service> 
</services> 

現在,每個服務的可在一個特定端點:

  • IContractService可達在http://YourServer/MyServices/Contact
  • ILetterService可達在http://YourServer/MyServices/Letter

等等....

對於每一個這種地址的,你現在可以從客戶端添加服務引用 - 只添加那些你真正需要的。一個應用可能只需要這些服務的單一,另一個可能需要兩個或三個等

+0

感謝marc_s的迴應。我已經嘗試了每個對象的單獨接口,但是當我使用VS10中的「添加服務引用」對話框時,我無法找到它們。我可以找到我的mex端點,但我只能配置我的app.config來顯示一個接口/合同。如果我點擊界面,我將顯示其操作列表,但是如何在「添加服務參考」對話框中添加更多的服務樹視圖服務分支下的一種界面類型。 –

+1

您將在服務的配置文件中擁有單個服務(實現) - 但每個協議都可以公開不同的端點(=不同的服務地址)。所以你可以有一個單獨的實現,但是公開了五個不同的端點(在五個不同的地址上) - 並且Add Service Reference將違背一個端點,所以它會一直向你顯示那個單一合約的操作(例如' Contact')。如果你想使用所有五六個服務合同,你需要添加五個或六個服務引用(對每個端點) –

+0

我已經設法增加一個合同到一個服務,並且似乎都按照計劃進行。感謝您的驗證。我對自己瞭解合同是什麼感到困惑。它是我的界面,而不是與界面相關的單個操作。我非常高興謝謝你的時間 –

1

只需添加到由Marc非常有用的答案,該接口需要被裝飾成以下,然後只,我們得到機會分別爲服務實施的每份合同添加獨立參考。

[ServiceContract(Name="Contact", Namespace="YourNamespace.IContactService")] 
public interface IContractService 
{ 
    ... 
} 

同樣,對於其他接口

[ServiceContract(Name="Letter", Namespace="YourNamespace.ILetterService")] 
public interface ILetterService 
{ 
    ... 
} 

無需添加這些屬性,我無法單獨的服務refernce添加到每個由公共服務實現的合同。