初学者WCF客户端/服务器松散耦合设计

时间:2012-07-25 17:13:18

标签: c# wcf client-server

我有一个与单个客户端通信的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是否可行,如果是,我该如何实现它们? (我之前从未使用过它们)
  • 我应该转移到名称值对模型以访问属性吗?这样一切都是通过字符串完成而不是枚举?
  • 我可以使用类似的方法来调用方法吗?

1 个答案:

答案 0 :(得分:0)

不是AFAIK的好方法。您没有使用弱类型对象,此代码将容易出现很多异常。如果处理不当,您还必须使用反射会损害性能。你应该在这里使用DataContract。

在MSDN上阅读有关DataContract的信息。可能值得阅读WCF书籍的初始章节或一些初学者教程。