2012-07-25 95 views
0

我有一個WCF服務與單個客戶端進行通信。我的目標是讓客戶儘可能少地更新,並且當我向我的服務添加新的屬性/方法時不需要更新。初學者WCF客戶端/服務器鬆散耦合設計

我的第一種方法,因爲在向我的服務添加屬性/方法時打破了我的目標,所以我需要更新客戶端的服務引用。

WCF服務DLL的結構如下所示:

- IMyService.cs 
- MyService.cs 
    - Hardware Interface 1.cs 
    - Hardware Interface 2.cs 
    - Definitions.cs 

在每一個硬件接口我有多個屬性和方法,我想客戶端訪問。

目前,我公開這些屬性的方式/方法,客戶端是通過以下方法IMyService:

[ServiceContract] 
interface IMyService 
{ 
    [OperationContract] 
    void MethodA(Object msg); 
    [OperationContract] 
    void MethodB(Object msg); 
    [OperationContract] 
    void MethodC(Object msg); 

    [OperationContract] 
    Object Hardware1GetProperty(Hardware1Property propID); //large switch case for all properties 
    [OperationContract] 
    void Hardware1SetProperty(Hardware1Property propID, Object val); //large switch case for all properties 


    [OperationContract] 
    Object Hardware2GetProperty(Hardware2Property propID); //large switch case for all properties 
    [OperationContract] 
    void Hardware2SetProperty(Hardware2Property propID, Object val); //large switch case for all properties 
} 

凡Hardware1Property和Hardware2Property存儲在Definitions.cs結構如下枚舉:

public enum Hardware1Property : uint 
{ 
    PropertyA, 
    PropertyB, 
    PropertyC, 
} 

由於客戶端可以訪問枚舉Hardware1Property和Hardware2Property,我認爲這將是一個很好的方法,因爲客戶端不必存儲服務上所有屬性的列表。因此,客戶可以通過執行以下操作獲取物業的價值,例如:

MyVar = MyClient.Proxy.Hardware1GetProperty(Hardware1GetProperty.PropertyA); 

如何改進此設計?

  • DataContracts是如何去的,如果是的話我該如何實現它們? (我以前從未使用過)
  • 我是否應該移動到名稱值對模型以訪問屬性?這樣一切都是通過字符串而不是枚舉來完成的嗎?
  • 我可以使用類似的方法來調用方法嗎?

回答

0

不是一個好方法AFAIK。您沒有使用弱類型對象,並且此代碼很容易出現很多異常。如果處理不當,您還必須使用反射,否則會損害性能。你應該在這裏使用DataContract。

閱讀關於DataContract的MSDN。可能值得閱讀WCF書籍的初始章節或一些初學者教程。

+0

感謝您的回答。我希望能夠更改傳遞的對象類型而不重新編譯客戶端。我會用'DataContracts'失去這個功能嗎? – 2012-07-26 19:22:52