実例で学ぶアプリケーション開発 Ver.2 - サンプルアプリケーションのポイント(2)WCF によるStored Procedure 呼び出し
皆様こんばんは!今日はWCFとの関係とStored Procedure についてご紹介しましょう。
WCF RIA Services と WCF との関係
さて、WCF RIA Servicesは、その名の通りWCFを通信基盤として利用しています。これはすなわち、WCFの持つ多くの機能を利用することができるということになります。
これはスケーラビリティやアベイラビリティを飛躍的に高めるとともに、セキュリティ等への対応も、また業務ごとのカスタマイズの要請も、WCFを通じて実現できることを示します。
・共通のプロトコルが利用可能
・カスタムバインディング、スケールアウト、等
たとえば、Polling Duplexといったライブラリを使って、プッシュ型のソリューション、ゲームやチャット、医療、金融向けアプリケーションなどを開発することができますし、実際に多くの事例が出始めています。また、WS-Security等、OASISで標準化されたメッセージレベルのセキュリティも扱うことができます。これはコンシューマ向けではあまり一般的ではないかもしれませんが、バックエンドのソリューション、特にクラウド時代の認証連携他を前提とした場合には、WS-TrustやWS-Federation等との関連で、重要な位置を占めています。
またRESTを前提としたADO.NET Data Services では、CRUD処理はエンドポイントが一つでURIベースのメソッドにより比較的実装し易かったのに対して、OLTPの処理や、ストアドプロシージャの処理をすることは苦手でした。逆にWCFは後者が得意です。
この両者を併せ持つWCF RIA Servicesは、RESTもSOAPも、CRUD処理もOLTPも、一つのフレームワークで、対応することができるのです。
ストアドプロシージャの呼び出し
ソリューションサンプルでは、ADO.NET Entity Framework を利用してストアドプロシージャを呼び出しています。ADO.NET Entity Framework を利用してストアドプロシージャを呼び出す場合、サービスで利用している ADO.NET Entity Data Model で下記の設定を行います。
① モデルブラウザ上でインポートされているストアドプロシージャを選択し、関数インポートを作成します。
② 関数インポート作成時にストアドプロシージャ名、および戻り値の型を指定します。
③ インポートしたストアドプロシージャがモデルブラウザで表示されます。
上記の手順でADO.NET Entity Framework を利用してストアドプロシージャを実行する準備が整います。
ストアドプロシージャをサービスから実行するサンプルは下記のコードのようになります。
サンプル: \MSStoreSample\MSStoreSample.Web\Services\OrderService.svc.cs
[OperationContract]
public void CreateOrder(string userId, int paymentType, Guid creaditCardId)
{
using (MSStoreSampleEntities context = new MSStoreSampleEntities())
{
context.Connection.Open();
using (DbTransaction transaction = context.Connection.BeginTransaction())
{
int createOrderResult = context.sp_CreateOrder(userId, paymentType, creaditCardId);
if (createOrderResult == 0)
{
throw new ApplicationException("オーダーを作成できませんでした。");
}
int deleteBasketResult = context.sp_DeleteBasket(userId);
if (deleteBasketResult == 0)
{
throw new ApplicationException("バスケットを削除できませんでした。");
}
transaction.Commit();
}
}
}
インポートされたストアドプロシージャは、DomainContext クラスのメソッドとして実装されるため、通常のメソッド呼び出しと同様に、その処理を呼び出すことが可能です。
鈴木 章太郎