Partager via


実例で学ぶアプリケーション開発 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等との関連で、重要な位置を占めています。

image

また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 で下記の設定を行います。

① モデルブラウザ上でインポートされているストアドプロシージャを選択し、関数インポートを作成します。

image

② 関数インポート作成時にストアドプロシージャ名、および戻り値の型を指定します。

image

③ インポートしたストアドプロシージャがモデルブラウザで表示されます。

image

上記の手順で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 クラスのメソッドとして実装されるため、通常のメソッド呼び出しと同様に、その処理を呼び出すことが可能です。

鈴木 章太郎