2012-07-25 101 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