2009年3月27日金曜日

DomainServiceが気になる

誰も彼もが気になってしかたがない.NET RIA Services。そうでもない?その中でも特に気になるのがデータ操作をラッピングしてサーバーサイドとのプロキシ動作を司るDomainServiceからはしばらく目が離せそうに無いですよね。得意のなんの脈絡もない展開ですいませんね。

.NET RIA Services - Building Data-Driven Applications with Microsoft Silverlight and Microsoft ASP.NET - MIX Videos

Microsoft ASP.NET 4.0 Data Access: Patterns for Success with Web Forms - MIX Videos

あれですよ、とにかく上記2つのMIX09セッションを見るべし、ですよ。英語だけど気にすんなよな!

ビデオ見た感じSilverlight3が目立ってる感じするかもしれないけど、そこじゃねっす。まじっす。気になるのはデータアクセス部分っす。Silverlight3からもASP.NETからも、はたまたJavaScript(これはちょっと特殊だけど)からも同一のサーバーサービスを呼び出してるよね。サーバーサービスを呼び出してるというか、サーバーサービス定義を元にジェネレートしたクライアント用クラスを使ってるよね。中身はサーバーサービスの呼び出しと、データ操作のトラッキングだろうと。サーバーサイド実装が何を使ってるのか気になる。ヒントはJavaScriptから呼び出してるデモの所で、DataService.axdがURIに含まれてるから、基本HttpHandler内に組み込まれてる機能なんだろうとは思うけど、それがWCFなのか独自実装(だとしたらパネーっす)なのか。Windows 7じゃないんだからWindows 7: Web Services in Native Code | pdc2008 | Channel 9ってことはないでしょうが。そんなこんなで"絶対読めよ"と↓こんな資料も。

Public Sector Developer Weblog : A MUST READ: Microsoft .NET RIA Services Overview

しょうがないからダウンロードして読んでみる。がんばる。読むというか見る...。

前半40ページくらいまで、こういう感じよ、こうやって書くよ、こんな感じで作るのよ、な説明が続くので、ビデオ見たのでそこはサラッと流す。EnableClientAccess属性が付いてるとクライアントコードをジェネレートするって書いてるけど、ジェネレートしなくてもサーバー上でだけでも使うならそれもよし。

こっからが、少し気になる部分の説明に入っていく。CRUD操作のR部分。デモでは何気なくGet~で書いたものをプロキシクラス呼び出すクライアントではLoad~って書いてロードしてるよね。ItemsSourceのところはコレクションプロパティ(this.Entities.GetEntityList<T>()って何が返るのかな~)を指定してるし。どういう風な関連付けがされてるのか気になるっす。空のコレクションを返しといて、あとはObserveに任せるのかな。Get~の部分はプレフィックスが「“Get”, “Fetch”, “Find”, “Query”, “Retrieve”, or “Select”」なら何でもいいみたいね。というか、Query属性をつけるなら、それすら関係無い。CoCなり。読み込みクエリーはLoad~が非同期で実行。

更新系もデモだとInsert/Update/Deleteがプレフィックスに付いてるけど、ここも何種類か規約でプレフィックスが用意されてる。データ取得と同じく、属性ベースでも指定可(Update/Insert/Delete属性)。クライアントでの更新結果はEntities.GetChanges()でEntityChangeSetを取得することですべて抽出できる。たぶんLINQ to SQLのDataContext.GetChangeSet()と同じようなものなんだろう。SubmitChanges()で更新情報をサーバーに送信して確定させるか、RejectChanges()で破棄。サーバー上では6つのパイプライン(クライアントから受信したもの→認可→検証→実行→永続化→同時実行エラー)に更新セットを流す(?)。トランザクション制御はやらないので、必要なら自分でオーバーライドしてTransactionScope使うべし。

Custom属性をつけたメソッド内での更新はクライアントのコンテキスト上で実行されるみたいで、ちゃんとクライアントてSubmitChangesしないとサーバーには反映されない。プロキシクラス内にそのまんまメソッドが展開されるんでしょうね。更新を伴わない場合はCustom属性じゃなくてServiceOperation属性。どっちも非同期みたい。

フィールドレベルの検証はDataAnnotationsを使ってMetadataクラスに定義。この辺はだいたいみんな同じような作り方になるのね。独自検証の場合はShared属性をつけたクラスで実装しとけば、それも自動生成に含めてくれるから、単純な検証以上の事をしたい場合はこれで。ビジネスロジックとしての検証はどこに書くのかな~?モデルクラスなのかな~?

後は認証や、認可の属性と続いてSilverlight、ASP.NET内で使うDomainDataSourceコントロールの説明と続く。ページングやらフィルタの指定もXAML内でできるのがカッコイイ。

後は、サンプルコードみたりしないとちょっとよく分からないけど、ビデオでは紹介されてない実装の細かいところはこのドキュメントにある程度書かれてる感じです。でも、もっと知りたいし、出来れば.NET RIA Services(Silverlight3環境必須)を入れなくてもDomainServiceだけでも試したいな~。コードサンプルが小野さんに教えてもらったASP.NET Dynamic Data 4.0 Preview 3にあるので、そっちを眺めてみようと思います。