SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Silverlight 4で作る新しいRIAアプリケーション

WCF RIA Servicesの仕組み

Silverlight 4で作る新しいRIAアプリケーション(4)

  • X ポスト
  • このエントリーをはてなブックマークに追加

ダウンロード sample.zip (793.6 KB)

ドメインサービスを利用したデータの操作の概要

 WCF RIA Serviceでは、サーバ側にドメインサービスを追加すると、「Generated_Code」フォルダの「RIAServicesSample.Web.g.cs」に、そのドメインサービスをWCFを利用して呼び出すためのプロキシクラスや、サービスコントラクトがビルド時に自動的に生成されます。

 ここでは、前編のサンプルコードを元に、データグリッドのデータを追加・削除する機能と、当月に使用した金額の合計を表示する機能を作成してみましょう。

データの追加と削除

 まずは追加と削除を行うボタンと、さらに当月に使用した金額を表示するボタンをMainPage.xamlに追加し、それぞれのイベントハンドラーを指定します。

 追加する場所は、保存、キャンセルボタンの上とします。リスト4の太字部分が、今回追加したコードです(リスト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)。

図6 修正後のMainPageのデザイナー画面
図6 修正後のMainPageのデザイナー画面

 続いてMainPage.xaml.csを開いて、イベントハンドラーを実装します。

 データへの操作は、DomainDataSourceコントロールが保持するエンティティに対して行います。DomainDataSourceコントロールはDataGridコントロールにバインドされているので、更新を行うとDataGridコントロールに即座に反映されます。ここではまだ、サーバのデータベースは更新されていないことに注意してください(リスト5)。

リスト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でのデータ更新の流れを示します。

図7 WCF RIA Servicesでのデータ更新の流れ
図7 WCF RIA Servicesでのデータ更新の流れ
メソッドの命名規則と属性

 ドメインサービスで定義するメソッドは、表1に示した命名規則に則って作成すると、WCF RIA Servicesでの操作とメソッドを自動的に割り当てます。メソッドの命名規則に従わない場合は、それぞれに対応した属性をメソッドに適用することで、命名規則に従った場合と同じ効果が表れます。

表1 操作のシグネチャとプレフィックスの対応
操作 属性 プレフィックス シグネチャ
検索 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.

次のページ
まとめ

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Silverlight 4で作る新しいRIAアプリケーション連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト かるあ (杉山 洋一)(カルア(スギヤマ ヨウイチ))

WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/5606 2010/12/28 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング