2009-06-23 150 views
6

例如,我有兩個託管在IIS中的服務。兩個具有不同合同但業務對象相同的WCF服務

[ServiceContract] 
public interface IDeviceService 
{ 
    [OperationContract] 
    DeviceCollection GetAllDevices(Customer customer); 

} 

[ServiceContract] 
public interface IUserService 
{ 
    [OperationContract] 
    User Authenticate(string username, string password); 

} 

無論是從UserService的身份驗證操作返回與用戶對象是從DeviceService的GetAllDevices操作返回的DeviceCollection有客戶的子對象的定義。 Customer是業務對象與User和Device對象位於同一個程序集中。

我的問題是在客戶端上 - 當我打電話的設備操作

userProxy.GetAllDevices(user.Customer); 

編譯器與以下消息抱怨:

參數1 - 無法從UserService.Customer轉換爲DeviceService.Customer

我可以連接到這兩個服務罰款,這是客戶的對象定義是這個問題。我並不想將這些運營部門放在與他們自己的服務自然生活相同的服務中。我想我問的是如何讓其他程序員處理這樣的問題?

乾杯, 斯圖爾特

回答

3

如果你想分享跨多個業務數據的合同,那麼你將不得不編譯有關數據合同到自己組裝,然後該程序集分發到客戶端。

儘管類型出現是相同的,但它實際上是兩個不同的類型,這就是爲什麼你看到你所看到的錯誤。您唯一的選擇(除了單獨的共享程序集之外)是將這兩個服務合併爲一個,以便他們可以共享數據合同。

+2

此外,添加服務引用時,您想使用「高級」選項卡指定應共享哪些類型。 – 2009-06-23 15:37:27

+0

Hiya,兩種服務相結合的問題是他們最終會變得龐大。我在Jual Lowrys的書中讀到過,你應該努力不要再讓這12個服務合同成員? – Simian 2009-06-23 16:03:38

+0

@Stuart - 我不會僅僅因爲這個原因而推薦合併服務。我相信你的服務是有目的地分開的,所以把他們聚集在一起並不總是合情合理的。我只是想確保你知道每一個選項。 – 2009-06-23 16:09:36

0

我想我會試圖回答我自己的問題,詳細說明我會如何來解決這個問題。它基於blog article by Dan Meineck上的一篇文章。

總之,我認爲我的每個根商業實體擁有多個服務的概念是錯誤的。

相反,我暴露其實現的幾個DataContracts例如

public partial class DeviceService : IDeviceService, IUserService 
{ 
} 

由於設備服務作爲一個局部類這讓我的業務的隔離中創建一個單一的服務,以及我說分開的,它們仍然是相同的服務但它允許我將它們分成單獨的文件並給服務提供一些結構化的組織。

最後一塊執行的是在服務定義如

<service behaviorConfiguration="GPSCloudHost.DeviceServiceBehavior" name="BusinessService.DeviceService"> 
<endpoint address="Device" binding="wsHttpBinding" contract="BusinessService.DataContracts.IDeviceService"></endpoint> 
    <endpoint address="User" binding="wsHttpBinding" contract="BusinessService.DataContracts.IUserService"></endpoint> 
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 

我不是在WCF經歷了足夠多說,如果這是「正確的」申報兩個端點解決方案或不是,但它正在滿足我的要求。如果其他人有更好的解決方案,我很樂意聽到它!

乾杯

0

這是一個語義問題。如果你想定義一個UserService。Customer和DeviceService.Customer在語義上相同,那麼您應該將該數據合約重新分配到單獨的程序集中。或者,如果要將UserService.Customer和DeviceService.Customer定義爲語義不同,請將它們保留爲單獨的類型並編寫實用程序函數以將其從一個轉換爲另一個。

2

一種選擇是在客戶端上使用AutoMapper將一種類型無縫轉換爲另一種類型。因爲他們具有相同的屬性映射將是直接的。

相關問題