非同期処理
Silverlightのデータ処理で、もう一つ大きな特徴となるのは、呼び出したWebサービスは、すべて非同期で処理されるということです。
例として以下のコードをご覧ください。初めにWCF側でサービスを準備します。ここではCreateOrderという名前で関数を公開します。
[OperationContract]
public void CreateOrder(string userId, int paymentType, Guid creaditCardId)
{
・・・
}
上記のサービスをSilverlight側で利用する場合、下図のようにサービスを参照してSilverlitghtプロジェクトにプロキシを作成する必要があります。
プロキシに作成されるメンバーは、非同期で呼び出すためのCreateOrderAsyncメソッドと、CreateOrderへの非同期呼び出しが完了した時点で実行されるCreateOrderCompletedイベントなどになります。SilverlightからWebサービスを利用する場合、以下の例にあるように、この2つのメンバーを活用する形になります。
using MSStoreSample.Client.OrderServiceReference;
. . . . .
private void paymentButton_Click(object sender, System.Windows.RoutedEventArgs e)
{
OrderServiceClient client = new OrderServiceClient();
client.CreateOrderCompleted += CreateOrderCompleted;
client.CreateOrderAsync(AuthenticationContext.Current.User.UserName,
3, Guid.Empty);
}
void CreateOrderCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
if (e.Error != null)
throw e.Error;
NavigationService.Navigate(new Uri("/Home", UriKind.RelativeOrAbsolute));
}
.NET RIA Services(WCF RIA Services)
Silverlightでデータ処理を考える場合、前述の例からもいくつか課題が浮かび上がります。例えば以下などです。
- データサービスの使い分け
- 非同期処理
さらに、複数の層に対してデータや処理が複雑に関連し合うシステム構成になりがちであり、開発生産性、保守性に対しても課題があると言えます。
こうした状況の解決のために追加されるのが、.NET RIA Servicesです(注3)。
PDCにおいて、.NET RIA Servicesは今後「WCF RIA Services」と名称変更されることが発表されました。
.NET RIA Servicesでは、サーバーサイドで定義されたエンティティ、ビジネスロジック(ビジネスオブジェクト)が、サーバー側のビルドを行うと、クライアントから使用することができるクラスやメソッドとしてクライアント側にジェネレートされます。
クライアントからは、この作られたクライアント側のオブジェクトを使用する形になります。その際、データの処理や非同期処理も自然な形で内部にカプセル化されることとなり、あえてデータサービスやその呼び出しを構成する必要はありません。
あたかもクライアント/サーバーのシステムを構築するように、Silverlightアプリケーションの開発が可能となります。
.NET RIA ServicesはVisual Studio 2010で実装される予定となっており(時期は未定)詳細に関しては、この連載の後で別途連載を行う予定になりますので、今回は割愛させてもらいたいと思います。
まとめ
今回は、Silverlightでアプリケーションを構築する際に必要とされるデータアクセスに関して紹介しました。次回以降からは、サンプルシステムを題材に、実際の処理に関してもう少しだけブレイクダウンして紹介したいと思います。


