連載:ADO.NET Entity Framework入門

第7回 EF4によるN層アーキテクチャと自己追跡エンティティ【後編】

WINGSプロジェクト 土井 毅 著/山田 祥寛 監修
2011/01/07
Page1 Page2 Page3

 前回の前編では、N層アーキテクチャで使用する自己追跡エンティティの仕組みについて説明した。後編となる今回は、自己追跡エンティティをWCF(Windows Communication Foundation)で公開し、Silverlightクライアントでの編集/更新処理を実装してみよう。


図1 3層アーキテクチャ・サンプル
赤線で囲んだ部分が今回実装する個所。

WCFによるサービスの公開

 WCFはWebサービスなどのアプリケーション間通信を共通の枠組みで取り扱うためのフレームワークである。WCFの適用範囲は.NETアプリケーション環境に限られておらず、データ形式もXMLやJSONなどに対応する、柔軟な通信フレームワークである。また、今回クライアントとして使用するSilverlightとの相性も優れており、Webサーバで提供されているサービスをSilverlightのクライアントから透過的に呼び出すことができる。

 WCFの詳細は以下の記事などを参照していただきたい。

 今回はごくシンプルに、以下のような自己追跡エンティティの取得/更新処理をWebサービスとして公開することにしよう。

サービス名 内容
GetEntries すべてのEntryを取得する
UpdateEntries 複数のEntryを一括で更新する
表1 今回公開するWebサービス

 SilverlightクライアントはGetEntriesサービスでEntryオブジェクトの一覧を取得し、クライアント側で編集を行った後、UpdateEntriesサービスでサーバにデータを書き戻す形となる。

 それではWCFサービスを実装していこう。

■プロジェクトの追加

 まずVisual Studio 2010のソリューションに、Silverlightアプリケーションを追加しよう。メニューバーの[ファイル]−[新規追加]−[プロジェクト]より「Silverlight アプリケーション」を追加する(図1)。


図2 Silverlightアプリケーションの追加
メニューバーの[ファイル]−[新規追加]−[プロジェクト]から表示される[新しいプロジェクトの追加]ダイアログで追加しているところ。

 追加後、図2のようなダイアログが表示されるので、[Silverlight のバージョン]欄を「Silverlight 4」に設定して[OK]ボタンを押す。


図3 Silverlightアプリケーションの設定

 この操作により、以下の2つのプロジェクトが追加される。

  • Silverlightアプリケーション・プロジェクト(AddressBookSilverlightApp)
  • Silverlightアプリケーションを公開するためのWebアプリケーション・プロジェクト(AddressBookSilverlightApp.Web)

 今回はAddressBookSilverlightApp.WebプロジェクトでWCFサービスの公開処理も含めることにする。それぞれのプロジェクトの役割を表2にまとめておく。

プロジェクト名 プロジェクト種類 役割
AddressBookData クラス・ライブラリ Entity Frameworkを使ったデータ・アクセスを行うプロジェクト。前回で作成済み
AddressBookSilverlightApp Silverlight
アプリケーション
Silverlightクライアントのプロジェクト。今回で実装
AddressBookSilverlightApp.Web ASP.NET Web
アプリケーション
Silverlightクライアントを公開するためのWebアプリケーション。このプロジェクトでWCFサービスも公開する
表2 サンプルで使用するプロジェクトとそれぞれの役割

■WCFサービスの実装

 ではAddressBookSilverlightApp.WebプロジェクトにWCFサービスを実装しよう。

 まずはメニューバーの[プロジェクト]−[新しい項目の追加]から「WCF サービス」を追加しよう。今回は「AddressBookService.svc」という名前でWCFサービスを作成する(図4)。


図4 WCFサービスの追加
「AddressBookService.svc」という名前でWCFサービスを作成する。
メニューバーの[プロジェクト]−[新しい項目の追加]から表示される[新しい項目の追加]ダイアログで追加しているところ。

 続いて自己追跡エンティティをWCFで公開するため、AddressBookDataプロジェクトへの参照を追加しよう。メニューバーの[プロジェクト]−[参照の追加]から表示できる[参照の追加]で[プロジェクト]タブより「AddressBookDataプロジェクト」を選択する(図5)。


図5 AddressBookDataプロジェクトへの参照を追加
メニューバーの[プロジェクト]−[参照の追加]から表示できる[参照の追加]で追加しているところ。

 WCFサービスを実装するため、AddressBookService.svc.cs/AddressBookService.svc.vbファイルを開き、これを次のリスト1のように修正する。

// エントリ一覧を取得するためのGetEntriesメソッド定義
// WCFで公開するためのOperationContract属性を付加
[OperationContract]
public List<Entry> GetEntries()
{
  using (var container = new AddressBookContainer())
  {
    // Entry一覧をリストで返す
    return container.Entries.ToList<Entry>();
  }
}

// エントリ一覧を更新するためのUpdateEntriesメソッド定義
// 同じくOperationContract属性を付加
[OperationContract]
public bool UpdateEntries(IEnumerable<Entry> entries)
{
  using (var container = new AddressBookContainer())
  {
    try
    {
      // 全エントリについて、ApplyChangesメソッドで更新を反映
      foreach (var entry in entries)
      {
        container.Entries.ApplyChanges(entry);
      }

      // SaveChangesメソッドでデータベースに書き戻す
      container.SaveChanges();
      return true;
    }
    catch (System.Data.OptimisticConcurrencyException ex)
    {
      return false;
    }
  }
}
' エントリ一覧を取得するためのGetEntriesメソッド定義
' WCFで公開するためのOperationContract属性を付加
<OperationContract()>
Public Function GetEntries() As List(Of Entry)
  Using container As New AddressBookContainer()

    ' Entry一覧をリストで返す
    Return container.Entries.ToList()

  End Using
End Function

' エントリ一覧を更新するためのUpdateEntriesメソッド定義
' 同じくOperationContract属性を付加
<OperationContract()>
Public Function UpdateEntries(ByVal entries As IEnumerable(Of Entry)) As Boolean

  Using container As New AddressBookContainer()
    Try
       ' 全エントリについて、ApplyChangesメソッドで更新を反映
       For Each entry In entries
        container.Entries.ApplyChanges(entry)
      Next

      ' SaveChangesメソッドでデータベースに書き戻す
      container.SaveChanges()
      Return True

    Catch ex As System.Data.OptimisticConcurrencyException
      Return False
    End Try

  End Using
End Function
リスト1 WCFサービスの実装(上:AddressBookService.svc.cs、下:AddressBookService.svc.vb)

 両メソッドに付加されているOperationContract属性は、WCFでメソッドを公開するために必要なものである。

 GetEntriesメソッドはシンプルに、オブジェクト・コンテキストのEntriesプロパティに格納されているEntryオブジェクトすべてをリストに変換してクライアントに返している。

 一方、UpdateEntriesメソッドでは、クライアントから渡されたEntryオブジェクトそれぞれについて、ApplyChangesメソッドで更新を反映し、オブジェクト・コンテキストのSaveChangesメソッドでデータベースへの書き戻しを行っている。

 ここでキモとなるのはApplyChangesメソッドで、これは自己追跡エンティティ自動生成時にオブジェクト・コンテキストのメソッドとして生成されている。このメソッドは、自己追跡エンティティの変更履歴を検証し、データベースに書き戻す際に必要な操作(追加/更新/削除)を決定する。

 なお、両メソッドの戻り値および引数で自己追跡エンティティが用いられているが、前回確認したとおり、自己追跡エンティティにはDataContract属性が付加されているため、WCFを介してそのまま送受信できる。

 

 INDEX
  ADO.NET Entity Framework入門
  第7回 EF4によるN層アーキテクチャと自己追跡エンティティ【後編】
  1.WCFによるサービスの公開/プロジェクトの追加/WCFサービスの実装
    2.Silverlightアプリケーションの実装 − サービス参照の追加
    3.UI実装とWCFサービス呼び出し/サンプルの実行/まとめ
 
インデックス・ページヘ  「ADO.NET Entity Framework入門」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間