現在、WebApiとWCF Data Servicesの間には他の大きな違いがありますが、誰も言及していないようです。MSが2つを比較する良い記事を出してくれるといいのですが。
私はしばらくの間ODataとWebApiをフォローしています。私はいつもいくつかの大きな違いを見つけました。
まず、上司が「MSがWebApiをサポートしている」とは、ODataをサポートしていないという意味ですか?IMO、彼らは両方を支持しており、現在いくつかの最小限の重複があります。Windows AzureデータマーケットはODataを使用してデータを公開し、Azure Table StorageはODataを使用し、SharePoint 2010はそのデータに対するODataクエリを許可し、MSの他の製品(Excel PowerPivotなど)もサポートしています。リレーショナルデータに関しては、非常に強力なクエリフレームワークです。また、RESTfulであるため、あらゆる言語、フレームワーク、デバイスなどを統合できます。
OData + WCF Data Servicesについて私が気に入っている点は次のとおりです。
OData + WCF Data Servicesは、Web経由でデータをクエリするときに、クライアントアプリケーションをより「表現力のある」ものにすることができるようになりました。以前は、常にASMXまたはWCFを使用して、手に負えず、UIが少し異なるものを必要とする場合は常に変更を必要とする堅固なWeb APIを構築する必要がありました。クライアントアプリケーションは、返す条件を指定するパラメーターのみを指定できます。または、私が行ったようにしてLINQ式を「シリアル化」し、それらをパラメーターとして渡しExpressions<Func<T,bool>>
て、サーバーに再水和します。そのまともな。仕事は終わりましたが、クライアントでLINQを使用し、RESTを使用してWeb経由で変換させたいと思います。これは、ODataが許可するものであり、ソリューションの独自の「ハック」を使用したくありません。
これは、DB接続文字列を必要とせずに「TRANSACT SQL」を公開するようなものです。単にURLとwhoalaを提供してください!クエリを開始します。もちろん、WebApiとWCF Data Servicesはどちらも認証/承認をサポートしているため、アクセスを制御したり、役割やその他のデータ構成に基づいて「Where」ステートメントを追加したりできます。SQLではなく、Web APIレイヤーでこれを行います(ビューの作成やストアドプロシージャなど)。アプリケーションがクエリを自分で作成できるようになったので、アドホックツールとBIレポートツールがODataを活用し始め、ユーザーが独自の結果を定義できるようになります。最小限の制御しか持たない静的レポートに依存しない。
Silverlight、Windows 8 Metro、またはASP.NET(MVC、WebFormsなど)で開発する場合、Visual Studioの「サービス参照」をWCFデータサービスに追加するだけで、LINQを使用してデータをクエリし、データを取得できます。クライアント上の「データコンテキスト」。つまり、変更を追跡し、変更を「送信」してサーバーにアトミックに戻すことができます。これは、RIA Services for Silverlightに非常によく似ています。私はRIAサービスの代わりにWCFデータサービスを使用していましたが、当時はDataAnnotationsまたはActionsをサポートしていませんでしたが、現在はサポートしています:) WCFデータサービスには、RIAサービスよりも「プロジェクション」を実行できるという利点があります。クライアントから。これは、エンティティからすべてのプロパティを返したくない場合に、パフォーマンスに役立ちます。「データコンテキスト」を持つ
そのため、特にSQL ServerとEntity Frameworkを使用している場合に、関係を持つデータがある場合、WCF Data Servicesは優れています。非常に少ないコードで、RESTを介してクエリ可能なデータ+アクション(操作を呼び出すための呼び出し、つまりワークフロー、バックグラウンドプロセス)をすばやく公開できます。WCF Data Servicesが更新されました。新しいリリースがリリースされました。すべての新機能をチェックしてください。
WCF Data Servicesのマイナス面は、HTTPスタックから解放される「コントロール」です。最大の欠陥は、IQueryable<T>
コレクションを返すメソッドにあることがわかりました。RIA Services AND WebApiとは異なり、IQueryableメソッドでロジックを開発するための完全なアクセス権はありません。RIAサービスとWebApiでは、戻って来る限り、好きなコードを書くことができますIQueryable<T>
。WCF Data Servicesでは、Expression<Func<T,bool>>
インターセプターメソッドを使用して「Where」ステートメントを追加するアクセス権のみを取得します。これはがっかりした。現在のアプリケーションはRIAサービスを使用しており、IQueryableロジックを制御する機能が本当に必要であることがわかりました。私はこれについて間違っていて、私は何かを逃していると思います
また、WCF Data Servicesは、まだすべてのLINQオペレーターを完全にはサポートしていません。ただし、WebApi以外にもサポートしています。
WebApiはどうですか???
- HTTPリクエスト/レスポンスの制御が好き
- 従うのは簡単です(MVCパターンを活用)。もっとツールが来ると確信しています。
今のところ(私の理解では)、WebApiはWCFデータサービス/ ODataのようなエンティティデータモデルを対象としていないため、クライアント(つまり、Silverlight、ASP.NETサーバー側コードなど)では「データコンテキスト」サポートがありません。です。IQueryable / IEnumerableを使用してモデルオブジェクトのコレクションを公開できますが、「データコンテキスト」がないため、エンティティがクライアントに読み込まれると使用する主キー/外部キー「ナビゲーションプロパティ」(つまり、customer.Invoices)はありません。非同期で(または$ expandを使用した1回の呼び出しで)それらをロードし、変更を管理します。RIAサービスやWCFデータサービスのように、クライアントでエンティティデータモデルのコード生成された「表現」がありません。データを表すモデルをクライアントに含めることはできません。ただし、データを手動で入力し、Web経由で取得した各「顧客」に設定する「請求書」を管理する必要があります。これは、特にAsyncに関するすべての処理が行われている場合、注意が必要です。どの通話が最初に戻るかわかりません。これをここで説明するのは難しいかもしれませんが、RIAサービスの「データコンテキスト」に関する情報を読んだり、WCFデータサービス。基幹業務アプリを扱う場合、これは私にとって大きな問題です。これは主に生産性と保守性に基づいています。データコンテキストがなくても、一時的にアプリを構築できます。特に、Silverlight、WPF、そして今ではWindows 8 Metroで、物事がより簡単になります。リレーショナルエンティティを非同期でメモリにロードし、Two-Bindingを用意しておくと、とても便利です。
とはいえ、これはいつかWebApiがクライアントで「データコンテキスト」をサポートできることを意味しますか?できると思います。また、より多くのツールを使用して、Visual Studioプロジェクトはデータベーススキーマ(またはエンティティフレームワーク)に基づいてすべてのCRUDメソッドを生成できます。
また、WCF Data ServicesまたはWebApiでの作業に関しては、.NETから.NET Frameworksについてのみ言及していることは承知していますが、HTML / JSも主要なプレーヤーであることをよく認識しています。Silverlight UI、またはASP.NETサーバー側コードなどを処理するときに見つけた利点について言及しました。「データコンテキスト」とJavaScriptのLINQフレームワークも利用できるようになり、JavaScriptからODataサービスへのクエリ機能がさらに簡単になります(ODataで現在DataJSを使用できます)。さらに、KnockoutJSを使用してMVVMをサポートし、HTML / JSでのバインディングもサポートすることで、それが簡単になります。
現在、使用するプラットフォームを調査しています。どちらを使用してもかまいませんが、次のアプリケーションは主にアナリティクス(読み取り専用)を対象としているため、表現力豊かなRESTful APIが必要なので、ODataに傾く傾向があります。私はOData + WCF Data Servicesが私にそれを与えると信じています。WebApiはコレクションに対して$ take、$ skip、$ filter、$ orderbyのみをサポートしているからです。プロジェクション、インクルード($ expand)などはサポートしていません。「更新/削除/挿入」があまりなく、データはかなり関係があります。
他の人も議論に参加して、彼らの考えを述べてほしい。私はまだ決定中であり、他の意見を聞きたいです。どちらも素晴らしいフレームワークだと思います。選択する必要があるのではないかと思うので、必要に応じて両方を使用してみませんか。クライアントからは、とにかくREST呼び出しを構築することがすべてです。ちょっとした考え :)