WCF と 型付データセット

内部的に型付データセットを使って処理しているデータについてWCFで外部に公開したいという状況がある。

 Passing DataTable across web/wcf services に「型付のDataTableをWCFで渡そうとする場合にはbugがある」というような話がみつかった。他のところではDataSetは重たいからやめようよ、とか。

MSDNのドキュメント データ コントラクトの XML および ADO.NET の種類 の最後に「DataSet、Typed DataSet、および DataTable の使用」という章がある。

  • この 3 つの型 (特に、DataSet と型指定された派生クラス) のスキーマは、一部の WCF 以外のプラットフォームと相互運用できない場合があります。また、このようなプラットフォームで使用しても、結果的に使いにくい場合もあります。また、DataSet 型の使用はパフォーマンスに影響を与えることがあります。さらに、将来的にアプリケーションのバージョン管理が通常より難しくなる可能性もあります。コントラクトでは、DataSet 型の代わりに、明示的に定義されたデータ コントラクト型を使用することを検討してください。
  • DataSet スキーマまたは DataTable スキーマをインポートする際には、これらの型を参照することが重要です。Svcutil.exe コマンド ライン ツールを使用すると、System.Data.dll アセンブリ名を /reference スイッチに渡すことによって、この参照を実現できます。

後者を読むと、DLLを持っていればインポートすることは可能だが、相互運用上可能な流儀の中ではその分のスキーマが提供されないということ。それだったら自力でシリアライズした結果であるバイナリを渡すということにして、WCF的にはバイナリ列を渡しますよ、にしてしまった方がすっきりする。MTOM使えば効率も上がるし。

データの中身を含めて相互運用できるようにするのであれば、前者で言われているように専用のコントラクトを設計すべき。

もう少し考察すると、アプリケーション内部で利用している型付データセットよりも、WCFのコントラクトの方がより広範囲に対する責任を持っているわけで、仕様としての生存期間も型付データセットよりWCFのコントラクトの方が長くなる可能性が高い。少なくともサービスとして生き残る気があるんだったらコントラクトの設計がより重要。

ネットワーク屋的に言い換えると コントラクトはプロトコル(の一部)なんで、重要なのは極めて当たり前だ。すでにそこにデータがあるからといって、コントラクト/プロトコル/インターフェース の設計はさぼるな、ということだな。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。