REMIX09 Tokyo、B-2セッションデモ・解説(2)
皆様、こんにちは!更新が遅くなりがちで申し訳ありません。早速続きにまいりましょう。
次のデモは、Rich Data Queryの追加です。これがこのRIA Servicesの最大のハイライトとなります。ほとんどのビジネスアプリはデータを扱います。そこで、 どのように.NET RIA Servicesがデータを取り扱うかを見ていきましょう。このWebのプロジェクトに追加していきます。
Entity Framework データモデルを使いますが、.NET RIA Servicesは、どのようなタイプのデータとも連携が可能です。たとえば、plain old CLR objects(POCO)といわれるものから、xml のファイルや、XML Web サービス、そしてLinq to Sqlまでいろいろです。最初に、Entity Framework modelをデータとして取り扱います。
このデモでは、わかりやすくするため、すごく単純なデータを扱います。単一のEmployeeテーブルをモデルとして使い、特別任務従業員(映画やアニメーションに出てくるキャラクターでNorthwindに入っているテーブル)をここから派遣するというシナリオです。
さて、Silverlightクライアントからどのようにデータにアクセスしたらよいでしょうか? もちろん、伝統的には多くのビジネスアプリケーションは、2階層のアプリケーションとしてスタートしました。しかし、これはスケーラビリティとフレキシビリティの点で、多くの問題を含んでいることは皆さんご存じのとおりです。さらに… もっといえば、このモデルは、Silverlight/Web クライアントアーキテクチャでは動きません。
そこで、開発者は、多階層のアプリケーションモデルを実装することになります。.NET RIA Services は、この多階層アプリケーションの開発を、より簡単にし、スケーラブルで、フレキシブルな、多階層サービスを作成することができ、そのサービスは、WCFやADO.NET Data Servicesと一緒に稼働可能です(もっと後で稿を改めて述べます)。
この.NET RIA Services が定義するのは、UI層のアプリケーションロジックであり、様々なデータソースに対するアクセスをカプセル化します。このデータソースには、伝統的なRDB、POCO (plain old CLR objects) から、クラウドサービス、たとえばAzure, アマゾンS3, 等(REST経由)が含まれます。これの素晴らしい点の一つは、オンプレミスのSQLサーバーのデータソースから、Azureのストレージサービスに切り替えるのに、UIロジックを全く変更する必要がないところです。
・最初のアプリケーション作成
それでは、いかに簡単に、この .NET RIA Servicesのアプリケーションを作成できるか見てみましょう。サーバープロジェクト側(/MyApp.Web)を右クリックして、追加→新規アイテム→Domain Service classを選びます。
Wizardの中で、データソースを選択します。ここではLinq2Sqlクラスを選んでいますが、POCO クラス等々ももちろん適用できます。
SuperEmployeeDomainService.cs クラスの中で、データアクセスに関するすべての操作―GetSuperEmployees(検索)、InsertSuperEmployee(新規作成)、UpdateSuperEmployee(更新)、DeleteSuperEmployee(削除) ―の各スタブが作成されます。
もちろん、このクラスの中を編集してこれらをカスタマイズすることもできます。今からしばらくの間、GetSuperEmployees()を使用しますので、少しカスタマイズしておきましょう。
GetSuperEmployees() の編集
public IQueryable<SuperEmployee> GetSuperEmployees()
{
return this.Context.SuperEmployeeSet
.Where(emp=>emp.Issues>100)
.OrderBy(emp=>emp.EmployeeID);
}
クライアント側(/MyApp )の処理
次に、クライアント側(/MyApp)に移りましょう。その前に、ソリューションのビルド処理を忘れないようにしましょう。これにより、Proxy Classが生成され、クライアントからダイレクトにソリューションにアクセス可能となります。これらのプロジェクトが作成されているのは、プロジェクト作成Wizardで作成するときに、“.NET RIA Services enabled”をチェックした為です。
ToolboxからDataGridを選んでHomePage.xamlにドラッグ&ドロップします ( どんなコントロールでももちろんこのプロジェクトの中で動きます ) 。Home.Xamlに下記を追加します。
<Home.Xaml>
<data:DataGrid x:Name="dataGrid1" Height="300" Width=”800”></data:DataGrid>
<Home.Xaml.cs>
そしてコードビハインドファイル(
HomePage.Xaml.cs)に、まずMyApp.Webへの参照を追加します。
using MyApp.Web;
これは何かちょっと奇妙な感じがしますが、要するにMyApp.Web は、サーバー側に定義されているということです。これで、クライアントプロキシにアクセスでき、サーバー側にあるDomainServices をローカルで操作できます。
public Home()
{
InitializeComponent();
var context = new SuperEmployeeDomainContext();
dataGrid1.ItemsSource = context.SuperEmployees;
context.Load(context.GetSuperEmployeesQuery());
}
最初の行では、SuperEmployeesDomainContextのインスタンスを作成しています。これは、client 側にあるSuperEmployeesDomainServiceです。次の行では、データグリッドに、当該SuperEmployeesを、データバインドしています。そして最後の行では、SuperEmployeesをロードしていますが、このクラスは、 サーバー側に定義されているGetSuperEmployees()メソッドです。
なおもちろん、これらはすべて非同期の処理であることに注意してください。ただ、ここで非同期の世界の複雑さを扱う必要は勿論ありません。Ctrl+F5で実行します。結果はこの通りです!
この状態では、ただ単にDataGridが自動的に生成したカラムを使って全件バインドしているのみで、ページングやソーティング、フィルタリングは全くできていません。そこで次回は、それらをひとつづつ、実行結果を確認しながらやっていきましょう。おもにXAMLのコーディング(Home.xaml)が中心となります。