ドメインサービスを利用したデータの操作の概要
WCF RIA Serviceでは、サーバ側にドメインサービスを追加すると、「Generated_Code」フォルダの「RIAServicesSample.Web.g.cs」に、そのドメインサービスをWCFを利用して呼び出すためのプロキシクラスや、サービスコントラクトがビルド時に自動的に生成されます。
ここでは、前編のサンプルコードを元に、データグリッドのデータを追加・削除する機能と、当月に使用した金額の合計を表示する機能を作成してみましょう。
データの追加と削除
まずは追加と削除を行うボタンと、さらに当月に使用した金額を表示するボタンをMainPage.xamlに追加し、それぞれのイベントハンドラーを指定します。
追加する場所は、保存、キャンセルボタンの上とします。リスト4の太字部分が、今回追加したコードです(リスト4)。
<StackPanel Orientation="Horizontal">
<Button Content="追加" Height="20" Width="60" Click="追加_Click" />
<Button Content="削除" Height="20" Width="60" Click="削除_Click" />
<Button Content="今月の合計金額" Height="20" Width="60" Click="今月の合計金額_Click" />
</StackPanel> <StackPanel Orientation="Horizontal"> <Button Content="保存" Height="20" Width="60" Command="{Binding ElementName=お小遣い明細DomainDataSource, Path=SubmitChangesCommand}" /> <Button Content="キャンセル" Height="20" Width="60" Command="{Binding ElementName=お小遣い明細DomainDataSource, Path=RejectChangesCommand}" /> </StackPanel>
リスト4の修正を行うと、Visual Studioのデザイナー画面には、保存ボタンの上に3つのボタンが表示されます(図6)。
続いてMainPage.xaml.csを開いて、イベントハンドラーを実装します。
データへの操作は、DomainDataSourceコントロールが保持するエンティティに対して行います。DomainDataSourceコントロールはDataGridコントロールにバインドされているので、更新を行うとDataGridコントロールに即座に反映されます。ここではまだ、サーバのデータベースは更新されていないことに注意してください(リスト5)。
/// <summary> /// 追加ボタンクリック時のイベントハンドラーです。 /// </summary> private void 追加_Click(object sender, RoutedEventArgs e) { // データソースに追加 var お小遣い明細一覧 = (DomainDataSourceView)お小遣い明細DomainDataSource.DataView; お小遣い明細一覧.Add(お小遣い明細.Create()); } /// <summary> /// 削除ボタンクリック時のイベントハンドラーです。 /// </summary> private void 削除_Click(object sender, RoutedEventArgs e) { // 選択中のレコードを特定 var 削除対象の明細 = お小遣い明細DataGrid.SelectedItem as お小遣い明細; if (削除対象の明細 == null) return; // データソースから削除 var お小遣い明細一覧 = (DomainDataSourceView)お小遣い明細DomainDataSource.DataView; お小遣い明細一覧.Remove(削除対象の明細); }
ドメインデータソースに格納されたデータは、ドメインデータソースのSubmitChangeメソッドが呼び出された際に、WCFを利用して、変更セットのみをサーバのドメインサービスに送信します。
ドメインサービスでは、受信した変更セットにどのような操作(CRUD)が加えられたかを判断し、あらかじめ登録された各メソッドを呼び出して、データベースへの更新処理を行います。
図7に、WCF RIA Servicesでのデータ更新の流れを示します。
ドメインサービスで定義するメソッドは、表1に示した命名規則に則って作成すると、WCF RIA Servicesでの操作とメソッドを自動的に割り当てます。メソッドの命名規則に従わない場合は、それぞれに対応した属性をメソッドに適用することで、命名規則に従った場合と同じ効果が表れます。
操作 | 属性 | プレフィックス | シグネチャ |
検索 | Query | 特に無し | IEnumerable、IQueryable、TEntityのいずれかを返すメソッド |
更新 | Update | Update/Change/Modify | void UpdateMethod(TEntity) |
追加 | Insert | Insert/Add/Create | void InsertMethod(TEntity) |
削除 | Delete | Delete/Remove | void DeleteMethod(TEntity) |
呼び出し | Invoke | 特に無し | 特に無し |
1つのエンティティに対しては同じ操作のメソッドを複数登録できないため、注意が必要です。
例えば、お小遣い明細エンティティに対して、1つのドメインモデルで「Updateお小遣い明細メソッド」と「Changeお小遣い明細メソッド」を登録できません。
重複した操作のメソッドを追加すると、次のように既にエンティティに対する別の操作が登録されているというビルドエラーが発生します。
The domain operation entry named 'Changeお小遣い明細' provides redundant functionality. Another method named 'Updateお小遣い明細' already exists.