単一のクライアントと通信する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は進むべき道ですか?もしそうなら、どうすればそれらを実装できますか?(私は以前にそれらを使用したことがありません)
- プロパティにアクセスするために名前と値のペアモデルに移動する必要がありますか?すべてが列挙型ではなく文字列を介して行われるように?
- メソッドの呼び出しに同様のアプローチを使用できますか?