3

WCF では、複数の操作コントラクトを使用する方が良いのか、ポリモーフィック データ コントラクトを使用する操作コントラクトを 1 つだけ持つ方が良いのか疑問に思っていました。

ちょっとした例を挙げましょう:

[OperationContract]
action1Answer action1(action1data a);

[OperationContract]
action2Answer action2(action2data a);

また

[OperationContract]
actionAnswer action(actionContract a);

アクション コントラクトは、action1Contract と action2Contract の両方が継承する抽象クラスになります。アクション コントラクトはdo()、そのインターフェイスでメンバー関数を指定し、子クラスでオーバーロードする必要があります。

個人的には、派生した actionContract でデータとアクションを適切にカプセル化でき、新しいアクションを簡単に追加できるため、2 番目のアプローチの方が興味深いと思います。しかし、私が WCF を使用するのは初めてなので、おそらくよく知っているでしょう!

4

2 に答える 2

3

この質問は、OO ポリモーフィズムと SOA の聖戦の境界線に接していますが、私は 2 セントを提供します。

サービス レイヤーの開発を検討している場合は、サービスのエンド コンシューマーに対して、何を渡し、何を期待するかを明確にする必要があります。アプローチ2はそれをうまく処理しません。(また、WCF で SOAP を実行し、他の .NET プロジェクトで wsdl からロードする場合、抽象クラスが適切にマークされず、インターフェイスが転送されません。WSDL には、インスタンス化できない基本クラスを記述する方法がないようです。 .)

ただし、認めなければならないのは、KnownTypeAttributes を使用した 2 番目のプロセスが優れていると思うことです (今 marc_s が投稿したように)。

于 2010-06-09T14:03:57.197 に答える
2

OOPの観点から、アプローチ#2の方が見栄えがよいことに同意します。

ただし、SOA / WCFとポリモーフィズムは通常あまり一致しません-SOA(少なくともSOAPベースの呼び出しを行う場合)には、サービスを定義するWSDL/XSDで表現できる具体的なクラスが必要です。

共通ベースタイプに基づいて派生データ型を使用できます。使用する場合は、 KnownType属性(またはServiceKnownType)を調べて、操作コントラクトが実際に示す以外のものを返す可能性があることをWCFに通知する必要があります。

于 2010-06-09T14:00:27.950 に答える