我能請得到暴露我的業務對象複雜的WCF服務的一些澄清。比方說,我有4個對象:contact
,organisation
,project
和letter
。WCF多個合同
是創造我的服務最好的辦法:
- 讓4個合約爲「服務對象」,並通過對象和預期的操作值/參數中的「服務對象」?或
- 爲所有對象及其功能(可能很多)創建合同?
非常感謝,
克里斯
我能請得到暴露我的業務對象複雜的WCF服務的一些澄清。比方說,我有4個對象:contact
,organisation
,project
和letter
。WCF多個合同
是創造我的服務最好的辦法:
非常感謝,
克里斯
按照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
等等....
對於每一個這種地址的,你現在可以從客戶端添加服務引用 - 只添加那些你真正需要的。一個應用可能只需要這些服務的單一,另一個可能需要兩個或三個等
感謝marc_s的迴應。我已經嘗試了每個對象的單獨接口,但是當我使用VS10中的「添加服務引用」對話框時,我無法找到它們。我可以找到我的mex端點,但我只能配置我的app.config來顯示一個接口/合同。如果我點擊界面,我將顯示其操作列表,但是如何在「添加服務參考」對話框中添加更多的服務樹視圖服務分支下的一種界面類型。 –
您將在服務的配置文件中擁有單個服務(實現) - 但每個協議都可以公開不同的端點(=不同的服務地址)。所以你可以有一個單獨的實現,但是公開了五個不同的端點(在五個不同的地址上) - 並且Add Service Reference將違背一個端點,所以它會一直向你顯示那個單一合約的操作(例如' Contact')。如果你想使用所有五六個服務合同,你需要添加五個或六個服務引用(對每個端點) –
我已經設法增加一個合同到一個服務,並且似乎都按照計劃進行。感謝您的驗證。我對自己瞭解合同是什麼感到困惑。它是我的界面,而不是與界面相關的單個操作。我非常高興謝謝你的時間 –
只需添加到由Marc非常有用的答案,該接口需要被裝飾成以下,然後只,我們得到機會分別爲服務實施的每份合同添加獨立參考。
[ServiceContract(Name="Contact", Namespace="YourNamespace.IContactService")]
public interface IContractService
{
...
}
同樣,對於其他接口
[ServiceContract(Name="Letter", Namespace="YourNamespace.ILetterService")]
public interface ILetterService
{
...
}
無需添加這些屬性,我無法單獨的服務refernce添加到每個由公共服務實現的合同。
問這個問題的原因,目前我有一個名爲contact_function1,contact_function2 ..... organisation_function1,organsiation_function2和我的服務文件變得相當長的服務中的所有功能。 –