Windows Phone 用 SharePoint リスト アプリケーション テンプレートのアーキテクチャ
Windows Phone SharePoint リスト アプリケーション テンプレートから作成されたプロジェクトのデザイン パターンについて理解します。 Windows Phone SharePoint Software Development Kit によりインストールされる Windows Phone SharePoint リスト アプリケーション テンプレートは、プロジェクトの一部をさまざまなコンポーネントに分けるパターンに基づいて Windows Phone アプリを生成するように設計されています。 このテンプレートは、パターンを確立するクラスおよびファイルを作成する作業を行い、開発者が特定の要件、ビジネス ロジック、およびデータに基づいて、生成されたプロジェクトの拡張に集中できるようにします。
Windows Phone SharePoint リスト アプリケーション テンプレートと MVVM デザイン パターン
Windows Phone SharePoint リスト アプリケーション テンプレートは、View-Model-ViewModel (MVVM) パターンと呼ばれるソフトウェア設計パターンに従って開発された Silverlight ベースのWindows Phone アプリ用の Visual Studio 2010 プロジェクトを生成します。 MVVM パターンは、プロジェクト内のコードを管理可能なレイヤーに編成および区画化する方法であり、個別に開発、テスト、変更できます。 これは、Windows Presentation Foundation (WPF) プロジェクトと Silverlight プロジェクトの特に効果的な開発パターンです。その他の利点の中でも、特定のアプリケーションのプレゼンテーション 層が基になるデータの構造にあまり厳密な依存関係を持たないため、開発者はさまざまなコンテキスト (たとえば、Web ブラウザー、モバイル デバイス インターフェイスなど) にプレゼンテーション 層を適応できます。 またはデスクトップ アプリケーション) と同じ基になるデータ構造を保持します。
たとえば、Silverlight アプリケーション内の特定の XAML ファイルに関連付けられた分離コード ファイル内にすべてのデータ管理コードを記述する単純なアプローチとは逆に、MVVM パターンに従ってプロジェクトを整理すると、最初に必要なクラス、継承モデル、パターンのコンポーネント間の通信方法を計画および開発する労力が必要になります。 Windows Phone SharePoint リスト アプリケーション テンプレートはこの初期構成とパターンを設定する開発作業を担当するため、機能 MVVM アプリケーションを迅速に開発するようにプロジェクトをカスタマイズおよび拡張できます。
MVVM パターンの主な 3 つのコンポーネントまたはレイヤーは、View、Model、ViewModel です。 Windows Phone SharePoint リスト アプリケーション テンプレートに基づくプロジェクトでは、これらのコンポーネントは図 1 に示すようなさまざまなプロジェクト ファイルによって実装されます。
図 1. MVVM パターンの Windows Phone SharePoint リスト アプリケーション ファイル
以下のセクションでは、これらのコンポーネントの Windows Phone SharePoint リスト アプリケーション テンプレートへの実装についての詳細を説明します。
Model コンポーネント
MVVM パターンの Model コンポーネントは、アプリケーションのデータを表すために使用されるクラスと構造体を参照します。 SharePoint リストに基づくアプリの場合、リストとその項目は基になるデータとして機能します。 Windows Phone SharePoint リスト アプリケーションでは、ListDataProvider クラスは、SharePoint リストに接続するための標準の SharePoint クライアント オブジェクト モデル操作を処理します。たとえば、ClientContext クラスのインスタンスを作成してそのプロパティを設定します。 テンプレート内の ListDataProvider クラスの正確な実装の詳細は、テンプレートに基づいてプロジェクトを作成するときに SharePoint Phone アプリケーション ウィザードの手順で指定されたオプションによって異なります。
ListDataProvider クラスの派生元である (Microsoft.SharePoint.Phone.Application.dll 内の) 基本クラス ListDataProviderBase は、SharePoint リスト データ用のキャッシュ メカニズムを実装しています。 リスト アイテムがサーバーから取得されると、それらは電話アプリに割り当てられたローカル メモリ内の ListDataProvider クラスによってキャッシュされ、これらのアイテムがアプリで必要になったときに、リソースを節約し、サーバーへのトリップを削減するために、このキャッシュが最初に確認されます。
SharePoint リストから取得したデータをフィルター処理する、または取得するデータそのもの指定する場合、(ListDataProvider.cs ファイル内の) ListDataProvider クラスのコードを変更することができます。 これらの目的で変更の必要の可能性が最もあるファイルの部分は、 LoadDataFromServer メソッドと静的な CamlQueryBuilder クラスの実装です。 ListDataProviderBase クラスから独自のクラスを派生させることもできます。 これを行った場合、必ず基本クラス LoadData および LoadItem から抽象メソッドを実装し、また基本クラスの Context プロパティ メンバーを実装し、適切な get アクセサー メソッドを提供するようにします。
View コンポーネント
MVVM パターンの View コンポーネントは、アプリのユーザー インターフェイス (UI) を参照します。 Silverlight ベースの Windows Phone アプリでは、View コンポーネントは UI 要素を宣言および修飾する XAML ファイルと、これらの XAML ファイルに関連付けられる、イベント ハンドラーおよびユーザーが UI 要素と対話する方法を決定する他のコードを実装する分離コードファイルから構成されます。
Windows Phone 向けの SharePoint リスト アプリケーションの開発のコンテキストにおいて、"ビュー" という言葉の 2 つの意味を区別することが重要です。 SharePoint リストは、たとえば既定のリスト用の [すべてのアイテム] ビューや、Calendar リスト テンプレートに基づいたリスト用の [現在のイベント] ビューなどの 1 つ以上のビューに関連付けられます。 これらのビューは、SharePoint リストのリスト アイテムを整理および表示する方法を示します。 アプリの対象にする SharePoint リストの種類 (およびカスタム ビューがリストに追加されたかどうか) に応じて、[すべてのタスク] や [現在のイベント] などのリストに関連付けられるビューは、テンプレートからプロジェクトを作成するときに SharePoint Phone アプリケーション ウィザードでアプリに含めるように選択できるようになります。 指定したビューを含めると、テンプレートは PivotItem コントロール ( Pivot コントロール内に含まれる) を生成して、リストのビューを表示します。
この "ビュー" という言葉の意味は、テンプレートの View に適用される言葉の意味とは区別されます。 Windows Phone SharePoint リスト アプリケーション テンプレートに基づくプロジェクトでは、View (プロジェクトの Views フォルダーに XAML ファイルとして実装) は、概念的に MVVM パターンの View コンポーネントのことをいいます。 つまり、プロジェクトでの View は、指定されたエンティティのデータ (または Model) 用のプレゼンテーション層を表します。 この場合、エンティティは SharePoint リストか SharePoint リスト アイテムのいずれかになります。
プロジェクト内の List フォーム (List.xaml) は SharePoint リストに関連付けられている既定のビューに対応していると言えますが、SharePoint リストの既定のビューとリスト フォームで表されるビューの概念的な違いは維持する必要があります。これは、プロジェクト内の List フォームがサーバー上のリストの既定のビューにマップされるとは限りません。 たとえば、サーバー上の既定のリスト ビューを変更する場合 (たとえば、特定の並べ替え順序を指定したり、特定のフィールドを表示したりした場合など)、変更はプロジェクトの List フォームを構成する XAML では表されません。 アイテムの順序は、サーバー上の SharePoint リストに関連付けられている既定のビューに対して構成されている順序に関係なく、SharePoint Phone アプリケーション ウィザードの選択内容 (またはリスト フォームの後続のカスタマイズに基づいて) に基づいて、アプリのリスト フォームに表示される順序を設定します。
List フォームは SharePoint リスト用の View (またはプレゼンテーション層) を表します。 他の 3 つの View ファイルは個々のリスト アイテムに関するもので、それらは SharePoint のリスト アイテム用のリスト アイテム メニューから (通常) 使用できるフォームに対応すると言えます。
Display フォーム (DisplayForm.xaml) は、SharePoint リストの View Item フォーム (DispForm.aspx) に対応します。 このフォームは、SharePoint リストの個々のアイテム用の View を示します。
Edit フォーム (EditForm.xaml) は、SharePoint リストの Edit Item フォーム (EditForm.aspx) に対応します。 このフォームは、指定のアイテムが編集ために表示される際に View を示します。
New フォーム (NewForm.xaml) ファイルは、SharePoint リストの New Item フォーム (NewForm.aspx) に対応します。 このフォームは、作成されリストに追加される指定のアイテム用の View を示します。
List フォームは、既定で常に Windows Phone SharePoint リスト アプリケーション テンプレートに基づいてプロジェクトに含められます。 プロジェクトの Views フォルダー内の他のフォーム用の XAML ファイルは、SharePoint Phone アプリケーション ウィザードで選択されたリスト操作 (新規作成、表示、または編集) に基づいて生成されます。
ViewModel コンポーネント
MVVM パターンの ViewModel コンポーネントは、View コンポーネントと Model コンポーネントとの間の対話を容易にするためのある種のブローカーとして機能するように意図される一方で、Model コンポーネントから View コンポーネントを切り離しているため、他方に悪影響を与えずに一方または他方を変更することが簡単です。 厳密に言うと、ViewModel コンポーネントは、View コンポーネントでのプレゼンテーションのために基となるデータを "形作る" ロジックを含めることがよくあるため、プレゼンテーション層の一部と考えられます。 Windows Phone SharePoint リスト アプリケーション テンプレートに基づくプロジェクトでは、ViewModel は、Model コンポーネント (つまり ListDataProvider クラスのオブジェクト) から取得した SharePoint リスト データを View コンポーネントの一部にある UI コントロール (たとえば Edit フォーム) にバインドするコードを実装しています。 リストからのデータの表示に使用されるコントロールの種類およびデータ型 (つまり、リスト アイテムのフィールド型がテキストであるか数値であるか、または SharePoint Choice フィールドのようなものであるかどうか) に応じて、ViewModel はまず指定した UI コントロールにデータをバインドできるように処理または変換します。
特に、プロジェクト内の ViewModel クラス (たとえば、 EditItemViewModel クラス) は、(Microsoft.SharePoint.Phone.Application.dll 内の) 基本クラス ViewModelBase から派生します。この基本クラスは、基になるデータ内の値が変わったときに、アプリのユーザー インターフェイスを構成している Silverlight コントロールが更新され、(コントロールに対して "双方向" のバインディングが構成されている場合) UI コントロールに保存された値への (他の方向に移動する) 変更を基になるデータに適用できるように、 INotifyPropertyChanged インターフェイスを実装しています。
図 2 は EditItemViewModel クラスのクラス継承階層、および Edit フォーム内の指定された UI コントロールと ViewModel の対応するフィールドとのバインドを簡単に示しています。
図 2. EditItemViewModel クラスと EditForm クラス
EditForm クラス (MVVM パターンからの View コンポーネントを表す) は、EditForm.xaml ファイルとその関連付けられた分離コード ファイル EditForm.xaml.cs の 2 つのファイルによって定義および実装されます。 EditForm.xaml.cs ファイルでは、 EditForm クラスの DataContext プロパティを EditItemViewModel クラスのオブジェクトに設定することによって、 EditItemViewModel クラス (MVVM パターンの ViewModel コンポーネントを表す) が EditForm.xaml.cs ファイルの View にバインドされます。
MVVM パターンに基づくソフトウェア デザインでは、多くの場合、ビジネス ロジックと検証ルーチンをパターンの Model コンポーネントに限定します。 それに対し、Windows Phone SharePoint List Application テンプレートに基づくプロジェクトでは、通常は Model コンポーネントの一部と見なされるいくつかの操作が、データ層 (Model) とプレゼンテーション層 (ViewModel) の間にある概念上の区別をわずかに曖昧にするという代償を払いながらも、ViewModel コンポーネントに実装されます。これにより、開発者がプロジェクトを拡張するのが容易になります。 たとえば、リスト アイテムを編集または作成する ViewModel クラス (つまり、EditItemViewModel クラスおよび NewItemViewModel クラス) は、ユーザーの入力したデータの検証を実装するために開発者がオーバーライドできる Validate メソッドを公開します。 (これらの ViewModel にデータ検証を実装する方法の詳細については、「SharePoint 用 Windows Phone アプリにビジネス ロジックとデータ検証を実装する方法」を参照してください。)
注:
ListDataProvider オブジェクトは、サーバーからデータの読み込みのみを行います。 Add、Update、Delete などのその他の操作は ViewModel 自体で実行され、その後にサーバーからの ViewModel データを更新するリフレッシュ コールが続きます。 こうした設計により、コードが乱雑になるのを抑制できます。
App.xaml ファイルと Silverlight アプリケーション モデル
App.xaml ファイルとその関連付けられた分離コード ファイルの App.xaml.cs は、管理された Silverlight アプリケーションの標準のコンポーネントです。 Silverlight 用のマネージド API を使用するアプリケーションでは、Silverlight アプリケーション モデルを実装するために、Silverlight Application クラスから派生したクラスを含める必要があります。 Application クラスは、画像、文字列、XAML テンプレートなどのリソースを管理するアプリケーション ライフサイクル イベントおよび機能をサポートしています。
プロジェクト内の App.xaml.cs ファイルに加える可能性がある変更の種類については、「方法: アプリケーションの状態情報を保持するために App.xaml.cs ファイルにイベント ハンドラーを実装する Windows Phone方法」および「方法: インスタンス化および追加の構成にWindows Phoneアプリで複数の SharePoint リストを使用する」を参照してください。 App.xaml.cs の ListDataProvider オブジェクト。