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