我有一个与单个客户端通信的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);
如何改进此设计?
答案 0 :(得分:0)
不是AFAIK的好方法。您没有使用弱类型对象,此代码将容易出现很多异常。如果处理不当,您还必须使用反射会损害性能。你应该在这里使用DataContract。
在MSDN上阅读有关DataContract的信息。可能值得阅读WCF书籍的初始章节或一些初学者教程。