January 2011

Volume 26 Number 01

Visual Studio - クラウドで成功を収めるために複数の種類の Visual Studio プロジェクトを使用する

Patrick Foley | January 2011 

コード サンプルのダウンロード

おそらくご存じでしょうが、最近の Visual Studio プロジェクトにはさまざまな種類があります。どの種類を選べばよいのでしょう。すべてのプロジェクトの種類には、それぞれ異なる状況で問題を解決できる長所があります。発生しているビジネス上の問題が 1 つだけでも、複数のユース ケースが含まれ、解決に最適なプロジェクトの種類が異なることはよくあります。

最近、このような実例に直面しました。このとき私は、成功事例の紹介を目的としたクラウド ベースのプログラムである Microsoft Solutions Advocates (microsoftsolutionsadvocates.com、英語) のインフラストラクチャ構築の責任者を務めていました。このソリューションの構築に複数の種類の Visual Studio プロジェクトを使用したことから、今回はこのときの Customer Success Stories (CSS) というプロジェクトを簡単な例として説明します。

CSS には、次の 3 つのユース ケースが存在します。

  1. 匿名ユーザーが公開 Web サイトの成功事例を閲覧する
  2. プログラムに登録しているユーザーが非公開の Web サイトにログインして、自身の成功事例を編集する
  3. 管理者が管理 Web サイトにログインして、ルックアップ テーブルなどの詳細情報を含む、すべてのデータを管理および編集する

ここでは、次の 3 つの Microsoft .NET Framework テクノロジを組み合わせる手法を採用しました。

  1. ASP.NET MVC (公開サイト用)
  2. WCF RIA Services (ユーザーが編集する非公開サイト用)
  3. ASP.NET 動的データ (管理サイト用)

これらのテクノロジのいずれか 1 つだけを利用してソリューション全体を作成することもできましたが、ここでは各テクノロジの最も優れた機能を利用することにしました。たとえば、ASP.NET MVC は標準の HTML を生成するため、環境を選ばず機能する公開 Web サイトの作成に最適なテクノロジです。公開サイトはマーケティングを目的としているため、最終的にはデザイナーに外観を整えてもらうことになります。デザイナーとの連携作業は複雑になりますが、ASP.NET MVC にはデザイナーの意図を簡単に反映できる簡潔なビューが実装されています。サイトを読み取り専用にして他のユース ケースから分離すると、デザイナーが関与する範囲を切り分けることができます。

ASP.NET MVC を使用してユーザーによる編集機能を実装することもできますが、この機能には WCF RIA Services の方が適しています (逆に、WCF RIA Services を使用して見栄えの良い公開 Web サイトを構築することもできますが、iPhone や iPad など一部のデバイスでは Silverlight がサポートされません。今回の公開用ユース ケースではできる限り多くのユーザーがアクセスできるようにする予定です)。Silverlight は普及しており、ユーザーが Silverlight を使用しているか、必要に応じてインストールすると想定しても問題なければ、Silverlight はわずかなプログラミング作業で機能豊富な編集エクスペリエンスを作り上げるのに最適で、成功事例サイトで共同作業するユーザーに適しています。

ASP.NET 動的データを使用すると、あまり手間を掛けずに管理ソリューションを構築できます。管理サイトの見栄えを良くする必要はありません。ソリューションに含まれるすべてのデータを SQL Server Management Studio を使用しなくても管理できるようにする必要があるだけです。ソリューションを進化させていくにつれて、ASP.NET 動的データ サイトを WCF RIA Services サイトに統合することも検討します。しかし、このようなデータ中心の開発プロジェクトの初期段階では、ASP.NET 動的データが便利で、構築のコストもほとんどかかりません。

Windows Azure を対象にする

既に述べたように、この例は実際の問題に基づいており、ソリューションには公開 Web サイトが必要になるため、Windows Azure と SQL Azure を対象プラットフォームに選択しました。Windows Server と SQL Server の方が広範に使用されていますが、運用上のメリット (OS の保守や更新プログラムの適用などが不要) からクラウドで実行する必要がありました。今回のプロジェクトでは、ソリューションをビルドする時間があまりなく、運用する余裕はまったくなかったため、Windows Azure が不可欠でした。

この例を実際に作成して Windows Azure で試してみるにはアカウントが必要です。microsoft.com/japan/windowsazure/offers には、さまざまなオプションとパッケージが用意されています。MSDN サブスクリプションの会員とマイクロソフトのパートナー企業の皆様 (BizSpark Startup の方も含みます。詳細については、microsoft.com/japan/mscorp/mic/bizspark/default.mspx を参照してください) は、数か月間無料でリソースにアクセスできます。プロトタイプの作成と学習 (この例を実際に作成してみる場合など) 向けには、"導入特別プラン" を利用できます。このプランでは、1 GB の SQL Azure データベースを 3 か月間、Windows Azure の S サイズのコンピューティング インスタンスを 25 時間無料で使用できます。プラットフォームを理解するのであれば、このプランで十分です。今回は導入特別プランを使用してこの例を構築しましたが、追加料金は必要ありませんでした。

Customer Success Stories (CSS) の概要

今回の例はチュートリアル形式で説明します。ユーザー レベルのセキュリティ、テスト、デザイナーとの連携、ごく単純なモデルからの進化など、実際の実装で重要ないくつかの側面については、ここでは扱いません。これらの作業については、今後の記事または私のブログ (pfoley.com、英語) で取り上げる予定です。

今回は手順をおおまかに示しているため、Visual Studio とその関連テクノロジについてある程度知識があることが前提です。ソリューション全体のコードは code.msdn.microsoft.com/mag201101VSCloud (英語) からダウンロードでき、手順ごとの詳細な説明については pfoley.com/mm2011jan (英語) を参照してください。

手順 1: Entity Framework Data Model 用プロジェクトを作成する

この例で使用するすべての Web テクノロジでは Entity Framework を効果的に使用するので、3 つのユース ケースで共通の Entity Framework モデルを共有して、ユース ケースを統合することにしました。既存のデータベースを操作する場合は、データベースからモデルを生成する必要があります。データベース レベルよりもモデル レベルで設計を考える方が好みであっため、今回はできる限りモデルを先に作成し、そのモデルからデータベースを生成することにしました。簡潔さを保つために、この例では Company と Story という 2 つのエンティティだけを使用します。

Entity Framework モデルは、独自のプロジェクトで作成して複数のプロジェクトで共有します (この手法については、Julie Lerman から学びました。詳細については、pfoley.com/mm2011jan01 (英語) を参照してください)。このようなベスト プラクティスを "秘密のハンドシェイク" と呼んでいます。初めて学ぶときは難しくても、秘密がわかれば簡単です。

  1. クラス ライブラリ プロジェクトで Entity Framework モデルを作成する
  2. モデルを共有するすべてのプロジェクトに接続文字列をコピーする
  3. モデルを共有するすべてのプロジェクトに、Entity Framework プロジェクトと System.Data.Entity への参照を追加する

まず、Visual Studio 2010 で Customer Success Stories という空のソリューションを作成し、CSSModel というクラス ライブラリ プロジェクトを追加します。クラス ファイルを削除し、CSSModel という空の ADO.NET Entity Data Model 項目を追加します。図 1 に示すように、Company エンティティと Story エンティティを追加し、2 つのエンティティの間にアソシエーションを追加します (Company エンティティを右クリックしてアソシエーションを追加する際は、確認のダイアログ ボックスで ['Story' エンティティへの外部キー プロパティの追加] チェック ボックスを必ずオンにします。外部キー プロパティは以降の手順で必要になります)。

Visual Studio プロジェクトへの Company エンティティと Story エンティティの追加

図 1 Visual Studio プロジェクトへの Company エンティティと Story エンティティの追加

モデルからデータベース テーブルを生成する準備はできましたが、データベース テーブルを配置する SQL Azure データベースが必要です。プロトタイプの作成が完了し、プロジェクトを進化させているときは、テスト目的でローカルの SQL Server データベースを追加すると便利ですが、今回の場合は SQL Azure データベースで直接作業する方が簡単です。

SQL Azure アカウントのポータルで、CSSDB という新しいデータベースを作成し、現在の IP アドレスを対象とする規則を追加して、[Firewall Settings] (ファイアウォール設定) タブの [Allow Microsoft Services access to this server] (Microsoft サービスからこのサーバーへの接続を許可する) チェック ボックスをオンにします。SQL Azure アカウント ポータルは図 2 のようなページです。

SQL Azure ポータルでの設定の構成

図 2 SQL Azure ポータルでの設定の構成

Visual Studio でデザイン サーフェイスを右クリックし、[モデルからデータベースを生成] をクリックします。新しい SQL Azure データベースへの接続を追加し、ウィザードを完了すると、データ定義言語 (DDL) が生成され、.sql ファイルで DDL が開きます (図 3 参照)。

データベース モデルの生成

図 3 データベース モデルの生成

SQL を実行するには、SQL Azure データベースに接続する必要があります ([Transact-SQL エディター] ツール バーの [接続] ボタンをクリックします)。SQL Azure では USE ステートメントがサポートされないため、ツール バーの [データベース] ボックスの一覧で新しいデータベースを選択してから SQL を実行する必要があります。これで、Visual Studio のサーバー エクスプローラー、SQL Server Management Studio、または新しい管理ツールである Microsoft Project (コード名 Houston、sqlazurelabs.com/houston.aspx、英語) で確認できる SQL Azure データベースが完成しました。ソリューションをビルドすると、プログラムからこのデータベースへのアクセスに使用できる Entity Framework プロジェクトも完成します。

手順 2: ASP.NET 動的データ プロジェクトを作成する

ASP.NET 動的データ Web サイトを使用すると、データベース内のすべてのデータを簡単に操作できるようになり、環境が正しく確実に機能するベースライン機能が提供されます。しかも、このような作業すべてを 1 行のコードで実現できます。

ソリューションに新しい ASP.NET 動的データ エンティティ Web アプリケーション プロジェクトを追加し、CSSAdmin という名前を付けます。手順 1. のデータ モデルを使用するには、CSSModel プロジェクトの App.Config から CSSAdmin プロジェクトの web.config に connectionStrings 要素をコピーします。CSSAdmin プロジェクトをスタートアップ プロジェクトに設定し、CSSModel プロジェクトと System.Data.Entity への参照を追加します。

ASP.NET 動的データ プロジェクトで実行できる高度な処理は多数ありますが、既定の動作を実装すると非常に便利です。そのためには、Global.asax.cs の RegisterContext が含まれる行をコメント解除して、次のように変更します。

DefaultModel.RegisterContext(typeof(CSSModel.CSSModelContainer), new ContextConfiguration() { ScaffoldAllTables = true });

プロジェクトをビルドして実行すると、データを管理する基本的なサイトが作成されます。テスト データを追加して、すべてが正常に動作することを確認しましょう。

手順 3: Windows Azure サービス プロジェクトを作成する

前の手順では、SQL Azure 上のデータベースにアクセスするローカル Web サイトを作成しました。次は、この Web サイトを Windows Azure 上で実行します。

Windows Azure アカウントのポータルで、CSS Storage というストレージ サービスと CSS Service というホストされているサービスを作成します。Windows Azure アカウントのポータルは図 4 のようになります。

Windows Azure ポータルでのサービスの作成

図 4 Windows Azure ポータルでのサービスの作成

Visual Studio で、ソリューションに CSSAdminService という新しい Windows Azure クラウド サービス プロジェクトを追加します (Windows Azure Tools for Microsoft Visual Studio がインストールされている必要があります)。ただし、ウィザードでクラウド サービス ソリューションを追加しないでください。クラウド サービス プロジェクトでは、開発とデバッグのためにアプリケーションをローカル バージョンの "クラウド ファブリック" で実行するのに必要なインフラストラクチャが追加されます。また、クラウド サービス プロジェクトでは Windows Azure への対話的発行が容易になります。これはプロトタイプの作成や単純な Windows Azure ソリューションに適していますが、Windows Azure の開発を本格的に開始したら、Windows PowerShell を使用して配置のスクリプトを (おそらく継続的な統合ソリューションの一部として) 作成する必要に迫られるでしょう。

CSSAdminService プロジェクトの Roles フォルダーを右クリックし、[Add] (追加) をポイントします。次に、[Web Role Project in solution] (ソリューション内の Web ロール プロジェクト) をクリックして、CSSAdmin プロジェクトをクラウド サービス プロジェクトと関連付けます。これで、ソリューションをコンパイルして実行するとソリューションが開発ファブリックで実行されるようになります。この時点では、ソリューションの動作は IIS や Cassini で実行した場合とまったく変わらないように見えますが、Windows Azure ソリューションを進化させる際は、サポートされていない Windows API を使用するなどのエラーを検出するうえで、開発ファブリック上でソリューションを実行することが重要です。

CSSAdminService プロジェクトを右クリックして [発行] をクリックし、Windows Azure アカウントに配置します。初めて発行する際は、資格情報を追加する必要があります (表示される指示に従って、証明書を Windows Azure アカウントにコピーします)。続いて、ソリューションの配置先の "ホストされているサービスのスロット" と "ストレージ アカウント" を選択します。ホストされているサービスのスロットには、運用環境とステージング環境の 2 種類があります。運用環境にある実際のソリューションを更新する場合は、まずステージング環境に配置してすべて正常に機能することを確認してから、ステージング環境を運用環境に昇格します。プロトタイプの作成中にソリューションを実行する予定はないため、今回は運用環境に直接配置します。[OK] をクリックして Windows Azure に配置します。この処理には数分かかることがあります。配置が完了したら、サービスのページ (図 5 参照) に表示されている Web サイトの URL を使用して、Windows Azure アプリケーションを実行します。

Windows Azure の配置済みサービス

図 5 Windows Azure の配置済みサービス

サービスが機能することを確認したら、配置を中断し、料金が発生しないよう必ず配置を削除します (使用量に基づいて支払うプランでは、サービス パッケージが実際に実行中かどうかに関係なく、サービス パッケージが配置されていれば料金が発生します)。サービス自体は削除しないでください。これは、サービスを削除すると、Web サイトの URL が使用可能な URL を集めたプールに戻されるためです。もちろん、実際の運用ソリューションに切り替える準備ができたら、Windows Azure サービスを停止せずに実行するための予算を確保する必要があります。

サービスの配置に失敗した場合、問題点が必ずしも正確に通知されるとは限りません。通常は、問題があるかどうかさえ通知されません。サービスの状態が、初期化中、ビジー、停止中、初期化中を繰り返すだけになります。このような現象が発生した場合は (その可能性は十分にあります)、ローカル リソース (ローカルの SQL Server データベースなど) にアクセスしようとしたり、Windows Azure に存在しないアセンブリを参照したりしていないか調べてください。パッケージの配置時に IntelliTrace を有効にすると (図 6 参照)、スローされた具体的な例外を特定して問題を究明できます。

Windows Azure へ発行する際の IntelliTrace の有効化

図 6 Windows Azure へ発行する際の IntelliTrace の有効化

手順 4: ASP.NET MVC プロジェクトを作成する

ここまで説明したソリューションは管理 Web サイトを構成するサイトです (ただし、ユーザー レベルのセキュリティは実装していません)。このサイトは Windows Azure 上で実行し、1 行のコードだけで SQL Azure データベースにアクセスしています。次は、公開 Web サイトを作成します。

ソリューションに、CSSPublic という新しい ASP.NET MVC 2 Web アプリケーション プロジェクトを追加します (この例を操作中は単体テスト プロジェクトを作成しないでください)。ASP.NET MVC の経験が豊富であれば、ASP.NET MVC 2 空の Web アプリケーションプロジェクトから作業を開始することもありますが、今回は既に機能する Web サイトの構造から始めて、目的の機能に合わせて少しずつ変更していきます。

CSSPublic プロジェクトを右クリックしてスタートアップ プロジェクトに設定してから、プロジェクトを実行して初期状態を確認します。CSS の公開サイトは読み取り専用で匿名ユーザーが使用するため、次の手順を実行してログインとアカウントの機能をすべて削除します。

  1. Site.Master から、logindisplay という div を削除します。
  2. メインの Web.config から、ApplicationServices 接続文字列と authentication 要素を削除します。
  3. AccountController.cs、AccountModels.cs、LogOnUserControl.ascx、および Views フォルダーにある Account フォルダー全体を削除します。
  4. もう一度プロジェクトを実行して、機能することを確認します。
  5. 手順 2. と同様、CSSModel プロジェクトの App.Config から CSSPublic プロジェクトの Web.config に接続文字列をコピーし、CSSModel プロジェクトと System.Data.Entity への参照を追加します。
  6. CSSPublic のすべての参照を選択し、"ローカル コピー" プロパティを True に設定します。

今回は Companies と Stories に別々のコントローラー (および関連付けられたビュー) を追加し、Home コントローラーをランディング ページのままにすると合理的だと考えますが、このような判断は重要です。デザイナーがサイトの見栄えを良くすることはできますが、何よりも情報アーキテクチャ (サイト構造) を正しく保つ必要があります。

モデル ビュー コントローラー (MVC: Model View Controller) プロジェクトでは、名前の付け方が重要です。複数を表すコントローラー名 (Company ではなく Companies) と、それぞれに対応するビュー フォルダーを使用します。コントローラー メソッドとビュー名には、Index、Details などの標準名前付け規則を使用します。どうしても必要な場合は名前付け規則を変更できますが、複雑さが増します。

Controllers フォルダーを右クリックして、CompaniesController という新しいコントローラーを追加します。このサイトでは動作を実装しない (読み取り専用) ため、明示的なモデル クラスは必要ありません。Entity Framework モデル コンテナー自体をモデルとして扱います。CompaniesController.cs で、using CSSModel ステートメントを追加し、Index メソッドを次のように変更して企業の一覧を返します。

CSSModelContainer db = new CSSModelContainer();
return View(db.Companies.ToList());

ビューを作成するには、Views フォルダーに空の Companies フォルダーを作成し、Companies フォルダーを右クリックして Index というビューを追加します。ビュー データ クラスに CSSModel.Company、ビュー コンテンツに List を指定して、ビューを厳密に型指定します。

Site.Master で、メニューのリスト項目を次のように追加して、新しいコントローラーを参照します。

<li><%: Html.ActionLink("Companies", "Index", "Companies")%></li>

アプリケーションを実行してメニューをクリックすると、企業の一覧が表示されます。既定のビューは出発点として適切ですが、不要な Id フィールドを削除します。このサイトは読み取り専用にする予定なので、Edit、Delete、および Create という ActionLink エントリを削除します。最後に、次のように企業名自体を Details ビューへのリンクに変更します。

<%: Html.ActionLink(item.Name, "Details", new { id=item.Id })%>

企業一覧は図 7 のようになります。

ASP.NET MVC Web サイトにおける企業一覧

図 7 ASP.NET MVC Web サイトにおける企業一覧

Details ビューを実装するには、次のメソッドを CompaniesController に追加します。

public ActionResult Details(int id)
{
  CSSModelContainer db = new CSSModelContainer();
  return View(db.Companies.Single(c => c.Id.Equals(id)));
}

id パラメーターは、URL の Companies/Details/ に続く整数を表します。この整数は、単純な LINQ 式で適切な企業を見つけるために使用します。

先ほどと同様に Companies フォルダーに Details フォルダーを追加します。ただし、今回はビュー コンテンツに Details を選択し、ビューに Details という名前を付けます。

プロジェクトを実行し、Companies ビューに移動していずれかの企業名をクリックすると、既定の Details ビューが表示されます。

Stories のコントローラーとビューを追加する作業も同様です。デザイナーに引き渡せる状態にするにはビューをかなり調整する必要がありますが、この方法は出発点として優れており、進化させるのが簡単です。

このプロジェクトが Windows Azure で機能するかどうか検証するために、CSSPublicService というクラウド サービス プロジェクトを作成し、このプロジェクトに CSSPublic ロールを追加します。サービスを開発ファブリックでローカルに実行してから、サイトを Windows Azure に発行し、公開 URL で実行します。検証が完了したら、配置を中断して削除し、料金が発生しないようにすることを忘れないでください。

手順 5: WCF RIA Services プロジェクトを作成する

この時点のソリューションには、Windows Azure 上で実行する (少なくとも実行可能な) ASP.NET MVC Web サイトと ASP.NET 動的データ Web サイトが含まれ、共有の Entity Framework モデルを使用して SQL Azure データベースにアクセスしています。手作業によるコード変更をほとんど必要としないで、かなりの量の機能を取得できました。WCF RIA Services Web サイトを追加すると、機能豊富な編集エクスペリエンスという要素も追加されます。

CSSCustomerEdit という名前 (スペースなし) の Silverlight ビジネス アプリケーション プロジェクトを追加すると、Visual Studio によって、2 つのプロジェクトがソリューションに追加されます。1 つは Silverlight クライアント (CSSCustomerEdit) で、もう 1 つは Web サービス (CSSCustomerEdit.Web) です。ソリューションを実行して、初期状態を確認します。CSSCustomerEdit プロジェクトの ApplicationStrings.resx を開き、ApplicationName の値を Customer Success Stories に変更して見栄えを良くします。

CSSCustomerEdit.Web プロジェクトで、CSSModel プロジェクトの connectionStrings 要素を Web.config にコピーし、CSSModel プロジェクトと System.Data.Entity への参照を追加して、すべての参照の "ローカル コピー" プロパティを True に設定します。続いて、Services フォルダーを右クリックし、CSSDomainService という新しい Domain Service Class (ドメイン サービス クラス) 項目を追加します。このクラスの名前の末尾を数字のない Service にして、2 つのプロジェクト間で使用できるツールのメリットを最大限得られるようにします (これも "秘密のハンドシェイク" です)。[追加] をクリックすると [Add New Domain Service Class] (新しいドメイン サービス クラスの追加) ダイアログ ボックスが表示されるので、すべてのエンティティのチェック ボックスと各エンティティの [Enable editing] (編集を有効にする) チェック ボックスをオンにします (図 8 参照)。

ドメイン サービス クラスの追加

図 8 ドメイン サービス クラスの追加

[Generate associated classes for metadata] (メタデータに関連付けられたクラスを生成する) チェック ボックスは選択できなくなっています。これは、今回お勧めしている手法のトレードオフを表しています。Silverlight ビジネス アプリケーションでは、メタデータ クラスを使用すると、範囲や表示される既定値などの詳細な検証ロジックを追加できます。しかし、Entity Framework モデルが CSSCustomerEdit.Web とは異なるプロジェクトに存在していると、これらのメタデータ クラスを追加できません。この機能を重視している場合や、ソリューションで特に Silverlight ビジネス アプリケーションの部分に力を入れる予定であることがわかっている場合は、異なるプロジェクトではなく ".Web" プロジェクトに直接 Entity Framework モデルを作成することをお勧めします。その場合も、別のプロジェクトで CSSCustomerEdit.Web プロジェクトを参照して Entity Framework モデルを共有できます。

既に述べたとおり、認証と承認については扱いませんが、この方針に従いながら試してみることはできます。CSSDomainService クラスに、ユーザーが編集を承認されている企業を表す、myCompany というプレースホルダーのプロパティを追加します。現時点ではこのプロパティを 1 にハードコーディングしていますが、最終的にはログイン プロセスで認証済みユーザーにとって適切な企業に設定します。

プロジェクトに固有のユース ケースを反映するように CSSDomainService クラスを編集します。このユース ケースでは、ユーザーは企業を更新できても挿入または削除できないので (挿入と削除は管理者が ASP.NET 動的データ Web サイトで行います)、挿入と削除のサービス メソッドを削除します。また、ユーザーが編集できるのは勤務先の 1 社だけなので、GetCompanies メソッドを GetMyCompany メソッドに変更します。同様に、GetStories メソッドを GetMyStories メソッドに変更し、ユーザーが作成する事例の CompanyId の値が myCompany の値と同じになるようにします。

private int myCompany = 1; // TODO: set myCompany during authentication
public Company GetMyCompany()
{
  return this.ObjectContext.Companies.Single(c=>c.Id.Equals(myCompany));
}
...
public IQueryable<Story> GetMyStories()
{
  return this.ObjectContext.Stories.Where(s=>s.CompanyId.Equals(myCompany));
}

public void InsertStory(Story story)
{
  story.CompanyId = myCompany;
  story.Id = -1; // database will replace with next auto-increment value
  ...
}

WCF RIA Services は、編集可能でフィールド指向のインターフェイスで威力を発揮しますが、単純なプロジェクトから開始して少しずつ機能を追加することが重要です。DataGrid コントロールと DataForm コントロールは強力ですが、私の経験では、作業を急ぎすぎたり一度に追加する機能が多すぎたりすると、問題が発生してやり直さなくてはならなくなります。少しずつ作業を進め、UI は 1 つずつ追加することをお勧めします。

この例の基本 UI を実装するには、CSSCustomerEdit プロジェクトで System.Windows.Controls.Data と System.Windows.Controls.DomainServices への参照を追加します。Company (単数名) と Stories に対する新しいビュー (Silverlight ページ項目) を作成し、既存の Home ビューと About ビューの XAML を模倣します。MainPage.xaml を編集して新しい区切りとリンク ボタンを追加します (また、既存の Home ビューと About ビューを選択して Company と Stories に使用することもできます)。

Silverlight 開発では、ほとんどの場合 XAML を編集することになります。CSSCustomerEdit プロジェクトの Company ビューに DomainDataSource 名前空間エントリと DataForm 名前空間エントリを追加します。また、Stories ビューには DataGrid 名前空間エントリを追加します。両方のビューの DataForm で、EditEnded イベントを処理して MyData.SubmitChanges.Stories.xaml を呼び出します。この XAML を図 9 に示します。

Stories ビューの XAML

図 9 Stories ビューの XAML

プロジェクトをビルドして実行してみると、正常に機能することがわかります。これで、機能豊富な編集エクスペリエンスを進化させる準備が整いました (図 10 参照)。

実行中の Stories ビュー

図 10 実行中の Stories ビュー

これまでの手順と同様、新しいクラウド サービス プロジェクトを作成し、Windows Azure に発行してテストします。CSSCustomerEditTestPage.aspx を Default.aspx にコピーしてエクスペリエンスを簡潔にすれば、作業は完了です。

"唯一確実な方法" はない

Visual Studio と .NET Framework を組み合わせると、Windows Azure 上で実行できるソリューションを多種多様な方法で作成できます。クラウド向けの次世代キラー アプリケーションを作成する "唯一の確実な方法" を探すことは魅力的ですが、複数のテクノロジの機能を活用して複雑な問題を解決する方が効果は大きくなります。こちらの方が、コードを作成しやすく、進化させやすく、さらに Windows Azure により運用が容易になります。

Patrick Foley は、マイクロソフトの ISV アーキテクト エバンジェリストとして、ソフトウェア会社がマイクロソフト プラットフォーム上でのソフトウェア構築で成功を収めるのを支援しています。彼のブログは pfoley.com (英語) です。

この記事のレビューに協力してくれた技術スタッフの Hanu Kommalapati に心より感謝いたします。