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

私の知る限り、良いアプローチではありません。弱い型付けされたオブジェクトを使用していないため、このコードは多くの例外が発生しやすくなります。また、適切に処理しないとパフォーマンスが低下するリフレクションを使用する必要があります。ここでは DataContract を使用する必要があります。

DataContract について MSDN を参照してください。WCF ブックの最初の章や初心者用チュートリアルを読む価値があるかもしれません。

于 2012-07-25T17:20:11.617 に答える