0

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

1 回答 1

0

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

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

于 2012-07-25T17:20:11.617 回答