Visual Studio LightSwitch

Visual Studio LightSwitch によって高度なプログラミングも簡単に

Beth Massi

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

Visual Studio LightSwitch は Visual Studio ファミリの新製品です。この製品の目的は、開発者がデスクトップやクラウド向けに、データ中心のビジネス アプリケーションを簡単に作成できるようにすることです。LightSwitch は、拡張可能な開発環境として、開発プロセスを簡略化し、開発者に代わって数多くの作業に対処するため、開発者はビジネス ロジックに集中することができるようになります。LightSwitch は、小規模ビジネスや各部署が "すぐに" 実現を必要とする生産性向上アプリケーションの開発に最適です。

LightSwitch は起動もすばやく、簡単に使い始められるため、自身のビジネスにとって重要な機能に重点を置いた開発が可能です。LightSwitch アプリケーションを動かすだけならコードを記述する必要はありませんが、ビジネス ルール、画面ワークフロー、ビジネス要件に特化したユーザーの生産性向上機能などを実現しようとすると、コードが必要になります。また、標準搭載されていない機能をアプリケーションに追加する場合は、LightSwitch 拡張機能を Visual Studio ギャラリーからダウンロードしてインストールすることもできます。また、Visual Studio 2010 Professional 以上のバージョンを使用して拡張機能を作成することも可能です。今後は、コミュニティから LightSwitch 向けにすばらしい拡張機能が提供されることも予想されます。

今回の記事は、代表的なデータ中心のビジネス アプリケーションの開発速度向上を目指して LightSwitch を使用したり、別の開発者がビルドした LightSwitch アプリケーションの拡張したりする、プロフェッショナルの開発者を対象としています。今回は、LightSwitch の開発者が利用できる高度な開発手法やカスタマイズ手法をいくつか紹介します。LightSwitch API の操作方法、カスタム画面レイアウトの作成方法、高度なクエリ処理の使用方法、複雑なビジネス ルールの記述方法、LightSwitch 拡張機能の使用方法と作成方法を取り上げます。機能の組み立てはすべて LightSwitch が制御するため、LightSwitch ビジネス アプリケーションの高度な機能のプログラミングも大幅に簡略化されていることがわかります。この記事で説明するサンプル アプリケーションは、code.msdn.microsoft.com/Contoso-Construction-9f944948 (英語) からダウンロードできます。

LightSwitch を使用した基本アプリケーションの作成をこれから始めることを考えている方は、LightSwitch デベロッパー センター (msdn.com/lightswitch) で、いくつかの資料に目を通されることをお勧めします。

アーキテクチャの概要

高度な LightSwitch 開発に進む前に、LightSwitch アプリケーションのアーキテクチャを理解しておくことが重要です。LightSwitch アプリケーションは、Silverlight と堅牢な .NET アプリケーション フレームワークに基づき、n 層アプリケーションの階層化やモデル - ビュー - ビューモデル (MVVM: Model-View-ViewModel) などの著名なパターンとベスト プラクティスを使用します。また、Entity Framework や WCF RIA サービスなどのテクノロジも使用します (図 1 参照)。LightSwitch チームは、新たなデータアクセス層や UI 層などの主要なテクノロジを導入することはせず、多くの開発者が現在構ビルドしている Microsoft .NET Framework ベースのテクノロジに適したアプリケーション フレームワークや開発環境を作成しました。

LightSwitch Application Architecture

図 1 LightSwitch アプリケーションのアーキテクチャ

こうしたアーキテクチャは、たとえば、スキャナーやバー コード リーダーなどのハードウェア デバイス、Microsoft Word、Excel などの他のアプリケーションと LightSwitch アプリケーションを統合して、デスクトップ アプリケーションとして配置できることを意味します。また、幅広く使用されるように、ブラウザベースのアプリケーションとして配置することも可能です。LightSwitch アプリケーションは、Windows Azure をはじめとして、さまざまな方法でホストすることもできます。

LightSwitch は、データと画面がすべてです。画面のデータは、Data Workspace (データ ワークスペース) によって管理されます。データ ワークスペースには、クエリを使って中間層データ サービスからエンティティをフェッチしたり、変更を追跡したり、保存パイプラインをさかのぼって中間層データ サービスに更新内容を送信したりする役割があります。保存コマンドを実行すると、データ ソースに対する 1 つの更新トランザクションとして実行される 1 つの変更セットと共にデータ サービスが呼び出されます。LightSwitch では複数のデータ ソースを扱うことができます (また、データ ソース間でエンティティを関連付けることも可能です)。LightSwitch アプリケーションが扱う各データ ソースには、それぞれ固有のデータ ワークスペースがあります。データ ソースに対するすべてのクエリおよび更新操作には、このデータ ワークスペースからアクセスします。エンティティ自体は、エンティティ状態、元の値、現在の値など、基盤となる詳細も公開します。

Visual Studio LightSwitch は、Visual Studio のエディションの 1 つです。開発環境全体は、LightSwitch アプリケーションのビルド専用に最適化されています。LightSwitch エディションだけをインストールすれば、すべての LightSwitch API、Silverlight、.NET Framework、カスタム画面レイアウトおよび画面ワークフロー、複雑な検証、保存パイプライン、アクセス制御フックを利用することができます。複雑な複合型の LINQ クエリを記述したり、COM 相互運用型を使用したり、クライアントとサーバー両方のプロジェクト コードにアクセスしたりすることが可能です。

ただし、既に Visual Studio 2010 Professional 以上のバージョンをインストールしている場合は、それらのエディションに LightSwitch が統合されるため、LightSwitch アプリケーションは [新しいプロジェクト] ダイアログ ボックスに 1 つのプロジェクト テンプレートとして表示されます。この場合はさらに、LightSwitch 向けにカスタム コントロールや拡張機能を作成することも可能です。

カスタマイズと拡張ポイント

LightSwitch によって、簡単なコードのカスタマイズから、本格的な拡張機能の作成、別の LightSwitch 開発者への拡張機能の配布まで、広範囲にわたるカスタマイズが可能になります。

LightSwitch には、エンティティ、クエリ、および画面用にコードを記述するための、数多くのフックが組み込まれています。各デザイナー上には、使用可能なメソッド フックを示す [Write Code] (コードの記述) というドロップダウン リスト ボタンがあります。ここから、検証の規則やセキュリティの規則を記述したり、保存パイプラインやクエリ処理を利用したりすることができます。記述するコードには、サーバーで実行するコード、クライアントで実行するコード、その両方で実行するコードがありますが、LightSwitch 開発者は通常、コードが実行される場所を意識する必要はなく、LightSwitch が必要なすべての処理を行います。それでも、追加機能を提供するためにクライアントやサーバーで特定のコードを記述するのであれば、LightSwitch ソリューションの構造について少し理解しておく必要があります。

ソリューション エクスプローラーで LightSwitch アプリケーションを表示すると、既定では [Logical View] (論理ビュー) が選択されています。[File View] (ファイル ビュー) を選択すると、実際のプロジェクトとファイル構造を表示することができます (図 2 参照)。

Flip to File View to See the Physical Structure

図 2 物理構造を確認するために [File View] (ファイル ビュー) に切り替える

[File View] (ファイル ビュー) を選択すると、Client のプロジェクトと Server のプロジェクトが表示されます。その下の階層には、LightSwitch 開発環境で作成したすべてのコードが物理的に配置される UserCode フォルダーがあります。ここに、独自のコード ファイルやクラスを追加して、LightSwitch コードから呼び出すことができます。クライアントは Silverlight フレームワークで実行され、サーバーは完全な .NET Framework 4 で実行されることを念頭に置いてください。後で、例をいくつか示します。

次のレベルのカスタマイズは、カスタム コントロールとカスタム データ ソースを作成して、LightSwitch プロジェクトから直接使用することです。たとえば、特定の機能を提供する特別な Silverlight コントロールを独自に作成して、LightSwitch の画面で使用できます。Visual Studio 2010 Professional 以上のバージョンを使用している場合、Silverlight クラス ライブラリ プロジェクト テンプレートにアクセスし、独自のコントロール ライブラリを構築して LightSwitch から使用することができます。LightSwitch では標準でサポートされていないデータ ソースに接続するために、WCF RIA サービスを作成することもできます。ただし、Visual Studio LightSwitch エディションしかインストールしていないユーザーでもカスタム コントロールやカスタム データ ソースを使用できるようにするには、それらを LightSwitch 拡張機能にパッケージ化する必要があります。

LightSwitch には、次に示す 6 つの拡張ポイントがあります。

  1. Custom Control (カスタム コントロール): 単一のスカラー値かデータのコレクションにバインドできる、1 つ以上の Silverlight コントロールから成るコントロール拡張です。別のコントロールをグループ化することもできます。コントロール拡張は、星評価コントロール、ゲージ、地図コントロールなどの単一のコントロールにすることも、発送先情報などのコントロールのグループにすることもできます。
  2. Screen Template (画面テンプレート): 画面作成時に、テンプレートの一覧が表示されます。画面テンプレート拡張は、この一覧に追加できる新しいテンプレートを作成します。この拡張により、カスタム画面から、その画面に含まれるコントロールのレイアウトを指定することが可能になります。
  3. Business Type (ビジネス タイプ): ビジネス タイプは LightSwitch 特有のもので、エンティティ プロパティ用に検証や書式設定を事前に用意することが可能になります。ビジネス タイプ拡張をビルドする際は、エディター コントロール、書式設定、検証をそのタイプ向けに定義します。たとえば、Phone Number や Email Address は LightSwitch 組み込みのビジネス タイプで、[Properties] (プロパティ) ウィンドウから宣言によって構成できます。また、特定の検証と書式設定を持つ、社会保障番号やパッケージの SKU 向けのビジネス タイプなどを作成することが可能です。
  4. Shell (シェル): シェルによって、アプリケーションのルック アンド フィール ("スキン") を変更することができます。また、ナビゲーション、コマンド、および画面も提供します。シェルを使用してそれらを提供するかどうかは、すべて開発者しだいです。
  5. Theme (テーマ): テーマは、LightSwitch アプリケーションのカラー パレットを提供します。テーマで指定するフォントのスタイルやブラシの色は、組み込みのシェルか、自身でビルドするカスタム シェルに適用されます。
  6. Custom Data Sources (カスタム データ ソース): すべてのアプリケーションにはなんらかのデータ ソースが必要です。LightSwitch では、データベース、SharePoint リスト、および WCF RIA サービスに接続することができます。この拡張によって、WCF RIA サービスを使用して外部のデータ ソースに接続することが可能になります。

拡張機能をビルドするには、Visual Studio 2010 Professional 以上のバージョン、Visual Studio SDK、および LightSwitch Extensibility Toolkit が必要です。拡張機能は、他の Visual Studio 拡張機能と同様、VSIX パッケージ形式で配布して、Visual Studio ギャラリーに配置できます。インストールは、拡張機能マネージャーを通じて行います。これも Visual Studio LightSwitch に同梱されています。

ここまでは、LightSwitch アプリケーションのアーキテクチャ、ソリューション構造、拡張性の範囲について説明してきました。ここからは、Contoso Construction サンプル アプリケーションの高度な機能を取り上げます。今回は、特定のカスタム コントロールを使ったりデータ ソースをカスタマイズしたりしないでアプリケーション全体をビルドしたため、必要なのは Visual Studio LightSwitch だけです。ただし、アプリケーションを拡張するために、一般に公開されている拡張機能をインストールして使用しました。これについては、後で説明します。

Contoso Construction アプリケーション

Contoso Construction アプリケーションにログインすると、まず、いつもの仕事、1 日の予定、および現在のプロジェクトを表示する、カスタマイズされたホーム画面が表示されます (図 3 参照)。このアプリケーションでは、顧客と各顧客の建設プロジェクト、およびプロジェクトで使用される建築資材を管理します。また、ユーザーが、各プロジェクトで撮影した写真の管理や、従業員と顧客とのスケジュールの設定も可能です。

The Contoso Construction Application Home Screen
(クリックすると拡大表示されます)

図 3 Contoso Construction アプリケーションのホーム画面

プロジェクトを選択すると、[Project Details] 画面が開き、関連する子プロジェクト、プロジェクトの建築資材、および画像を含むタブ コントロールが表示されます。LightSwitch でのデータベースへの画像の保存は、エンティティのプロパティを (画像エディターと画像ディスプレイを持つ) 組み込み型の Image に指定すると、自動的に処理されます。

[Project Details] (プロジェクトの詳細) 画面のリボンには、プロジェクトの状態についてのレポートを生成するボタンもあります。このボタンは COM を使用して、Microsoft Word が自動的にプロジェクトと建築資材の一覧をドキュメントに送信するようにします。アプリケーションのその他の機能には、顧客と従業員に予定を送信するためのサーバーと電子メールの統合、監査記録、集計クエリによるレポート、およびカスタム クエリ ビルダーがあります。LightSwitch には、データをグリッド形式で Excel にインポートするためのサポートが既に組み込まれています。また、Contoso Construction アプリケーションには、ユーザーがスプレッドシートから画面に直接建築資材のデータをアップロードできるインポート機能もあります。アプリケーションの高度な部分をいくつか取り上げ、どのようにビルドしているかを説明していきます。

複雑な画面レイアウト

LightSwitch で画面をビルドする際は、コンテンツ ツリー内のすべてのコントロールをデータ項目にバインドする必要があります。データ項目とは、エンティティのフィールド、エンティティのコレクション、または ViewModel に追加するその他のデータ項目などのことです。画面テンプレートにより、特定の種類の画面 (検索画面、詳細画面、新規データ画面など) のレイアウトやデータ バインドをすべて設定することができます。単一のエンティティを操作する画面もあれば、エンティティのコレクションを操作する画面もあります。Search Data Screen (データ検索画面) テンプレート、Editable Grid Screen (編集可能グリッド画面) テンプレート、List and Details Screen (一覧および詳細画面) テンプレートは、定義可能なクエリから返されるエンティティのコレクションを操作します。Details Screen (詳細画面) は、特定のエンティティを操作して、取得するエンティティの一意 ID であるパラメーターをクエリに渡します。

これらのテンプレートは、さらにカスタマイズが可能な、単なる出発点にすぎません。実際、エンティティのコレクションを操作する画面テンプレートは選択できても、画面のデータを選択することはありません。[Add New Screen] (新しい画面の追加) ダイアログ ボックスで [Search Data Screen] (データ検索画面) を選択して [OK] をクリックすると、ゼロから編集できる空の "キャンバス" を作成することができます。または、テンプレートを選択すると、表示する基本画面データを選択して、画面にデータ項目を必要なだけ追加することができます。

データ項目は、文字列や整数などの基本プロパティにも、画面コードやボタンから呼び出すメソッドにも、クエリを起点とするエンティティにもなります。画面にデータ項目を手動で追加するには、Screen Designer (スクリーン デザイナー) の上部にある [Add Data Item] (データ項目の追加) ボタンをクリックします。その後、データ項目の名前と種類を指定できます。ホーム画面は、これらの種類のデータ項目の組み合わせです (図 4 参照)。

Data Items and the Content Tree in Screen Designer
(クリックすると拡大表示されます)

図 4 スクリーン デザイナーにおけるデータ項目とコンテンツ ツリー

画面では、ツリーのコンテンツを非常に柔軟にレイアウトすることができます。すべてのデータ項目を追加した後、レイアウトを変更するには、通常は (F5 キーを押して) アプリケーションを実行し、画面を開いて、アプリケーションの右上隅で [Design Screen] (デザイン画面) をクリックするのが簡単です。これにより、レイアウトを変更して、リアルタイムに更新内容を確認することができます。Table Layout、Rows Layout、Columns Layout などのグループ化コントロールを使用すると、コントロールが表示される場所や方法を正確に微調整することができます。正確なサイズを指定するためには、[Properties] (プロパティ) ウィンドウのサイズ変更プロパティを微調整します。さらに、アプリケーションの上部にリボンを表示する [Screen Command Bar] (画面コマンド バー) に加え、あらゆるコントロールにコマンド バーを指定することができます。これにより、ツリーの項目下にボタンやハイパーリンクを配置できます。図 4 では、SearchProjects という静的テキスト プロパティのコマンド バーの [Control Type] (コントロールの種類) が [Link] (リンク) に設定されています。これは、アプリケーションの実行中、テキストの下に右揃えで表示されます (図 3 参照)。

ホーム画面には、多くの静的テキストと画像が表示されています。画面上のボタンに画像を追加するには、[Properties] (プロパティ) ウィンドウでそれらを設定するだけです。ただし、画面に直接画像や静的テキストを表示する場合は、いくつかやるべきことがあります。[Add Data Item] (データ項目の追加) ダイアログ ボックスで、ローカル プロパティとして静的画像やテキストを画面に追加して、コンテンツ ツリーでそれらをレイアウトします。静的プロパティはデータ エンティティから取得されないため、画面表示前にプロパティ値を設定する必要があります。これは、あらゆるクエリの前に実行される、画面の InitializeDataWorkspace メソッドで行います。たとえば、1 つの画像と 1 つのテキストの静的プロパティを設定するには、次のようなコードを記述します。

Private Sub Home_InitializeDataWorkspace(saveChangesTo As List(Of IDataService))
            
  ' Initialize text properties
  Text_Title = "Contoso Construction Project Manager"
   
  ' Initialize image properties
  Image_Logo = MyImageHelper.GetImageByName("logo.png") 
  
End Sub

静的画像を読み込むためには、[File View] (ファイル ビュー) に切り替え、その画像を Client プロジェクトの \Resources フォルダーに配置して、[Build Action] (ビルド アクション) を [Embedded Resource] (埋め込まれたリソース) に設定します。次に、画像を読み込むために、コードを少し記述します。Contoso Construction サンプル アプリケーションは、さまざまな画面で静的画像を使用するため、クライアント コードのどこからでも使用できる MyImageHelper というヘルパー クラスを作成しました。[File View] (ファイル ビュー) で、Client プロジェクト下の \UserCode フォルダーを右クリックし、[Add] (追加) をポイントして [Class] (クラス) をクリックします。名前を MyImageHelper とし、画像を読み込む静的メソッド (Shared) を作成します (図 5 参照)。

図 5 MyImageHelper クラス

''' <summary>
''' This class makes it easy to load images from the client project.
''' </summary>
''' <remarks></remarks>
Public Class MyImageHelper
  Public Shared Function GetImageByName(fileName As String) As Byte()
    Dim assembly As Reflection.Assembly = 
      Reflection.Assembly.GetExecutingAssembly()
    Dim stream As Stream = assembly.GetManifestResourceStream(fileName)
    Return GetStreamAsByteArray(stream)
  End Function

  Private Shared Function GetStreamAsByteArray(
                          ByVal stream As System.IO.Stream) As Byte()
    If stream IsNot Nothing Then
      Dim streamLength As Integer = Convert.ToInt32(stream.Length)
      Dim fileData(streamLength - 1) As Byte
      stream.Read(fileData, 0, streamLength)
      stream.Close()
      Return fileData
    Else
      Return Nothing
    End If
  End Function
End Class

このようにして、カスタム コードをクライアントに追加することができます。たとえば、Contoso Construction サンプル アプリケーションには、建設プロジェクトのデータを COM 経由で Word にエクスポートするヘルパー クラスもあります。総括すると、LightSwitch は非常に柔軟に独自のカスタム コードやクラスを追加できると言えます。

保存パイプラインを操作する

同じ方法で、独自のコードを Server プロジェクトに追加することもできます。サンプル アプリケーションには、ユーザーが顧客と従業員との予定を設定できる予定画面があります。顧客と従業員が電子メール アドレスを持っていれば、予定エンティティがデータ ソースに挿入されたとき、予定についての電子メール通知 (iCal) が両当事者に送信されます。保存パイプラインは、ビジネス ルールの記述、別のサービスの呼び出し、およびワークフローの開始に使用できる多くのメソッド (すべてのエンティティの Inserted/Inserting、Updated/Updating、および Deleted/Deleting メソッド) を公開します。

SMTP 電子メール経由で予定を送信するヘルパー クラスは、Server プロジェクトの \UserCode フォルダーにあり、SMTPMailHelper といいます。また、アプリケーションは、予定がシステムで更新または削除されると、更新や取り消しを送信します。これらの保存パイプラインのメソッドにアクセスするためには、デザイナーでエンティティを選択して、[Write Code] (コードの記述) ドロップダウン リスト ボタンを選択します。メソッドにマウス カーソルを合わせると、ツールチップが表示され、コードの実行場所 (クライアント、サーバー、またはその両方) が示されます。予定エンティティの場合、新しい予定電子メール、更新された予定電子メール、または取り消された予定電子メールを追跡して送信するために、図 6 のサーバー側のメソッドにコードを挿入する必要があります。

図 6 予定についての電子メール通知を検出して送信するサーバー側のメソッド

Private Sub Appointments_Inserting(ByVal entity As Appointment)
  'Used to track any iCalender appointment requests
  entity.MsgID = Guid.NewGuid.ToString()
  entity.MsgSequence = 0
End Sub

Private Sub Appointments_Updating(ByVal entity As Appointment)
  'Update the sequence anytime the appointment is updated
   entity.MsgSequence += 1
End Sub

Private Sub Appointments_Inserted(ByVal entity As Appointment)
  'Send an email notification when an appointment is inserted into the system
  Dim isCanceled = False
  SMTPMailHelper.SendAppointment(entity.Employee.Email,
                                 entity.Customer.Email,
                                 entity.Subject,
                                 entity.Notes,
                                 entity.Location,
                                 entity.StartTime,
                                 entity.EndTime,
                                 entity.MsgID,
                                 entity.MsgSequence,
                                 isCanceled)
End Sub

  Private Sub Appointments_Updated(ByVal entity As Appointment)
    'Send an email update when an appointment is updated. 
    Dim isCanceled = False
    SMTPMailHelper.SendAppointment(entity.Employee.Email,
                                   entity.Customer.Email,
                                   entity.Subject,
                                   entity.Notes,
                                   entity.Location,
                                   entity.StartTime,
                                   entity.EndTime,
                                   entity.MsgID,
                                   entity.MsgSequence,
                                   isCanceled)
           
End Sub

   Private Sub Appointments_Deleting(entity As Appointment)
     'Send an email cancellation when an appointment is deleted.
     Dim isCanceled = True
     SMTPMailHelper.SendAppointment(entity.Employee.Email,
                                    entity.Customer.Email,
                                    entity.Subject,
                                    entity.Notes,
                                    entity.Location,
                                    entity.StartTime,
                                    entity.EndTime,
                                    entity.MsgID,
                                    entity.MsgSequence,
                                    isCanceled)

End Sub

また、監査記録を実装する際にも、保存パイプラインを操作します。監査記録は、ビジネス アプリケーションでよく使用される機能で、システムのレコードにどのような変更をだれが加えたかを追跡します。サンプル アプリケーションでは、EmployeeChange テーブルによって Employee フィールドへの変更を追跡します (図 7 参照)。

An Audit Trail Is a Common Business Application Requirement

図 7 監査記録はビジネス アプリケーションの一般的な要件

更新後の Employee の新しい値と元の値を取得するには、エンティティの Details プロパティを参照します。これは高度なエンティティ API で実行できます。Employees_Updating メソッドでは、エンティティのすべてのストレージ プロパティを動的にループ処理して、新しい値と元の値を記録します (図 8 参照)。

図 8 監査記録を作成するための Employee エンティティの Details プロパティの調査

Private Sub Employees_Updating(entity As Employee)
  'Audit trail that tracks changes to employee records
  Dim change = entity.EmployeeChanges.AddNew()
  change.Employee = entity
  change.Updated = Now()
  change.ChangedBy = Me.Application.User.FullName
  Dim newvals = "New Values:"
  Dim oldvals = "Original Values:"

  For Each prop In entity.Details.Properties.All().
    OfType(Of Microsoft.LightSwitch.Details.IEntityStorageProperty)()

    If prop.Name <> "Id" Then
      If Not Object.Equals(prop.Value, prop.OriginalValue) Then
        oldvals += String.Format("{0}{1}: {2}", 
                                 vbCrLf, 
                                 prop.Name, 
                                 prop.OriginalValue)
        newvals += String.Format("{0}{1}: {2}", 
                                 vbCrLf, 
                                 prop.Name, 
                                 prop.Value)
      End If
    End If
  Next
  change.OriginalValues = oldvals
  change.NewValues = newvals
End Sub

保存パイプライン、検証フレームワーク、およびエンティティ API の詳細については、LightSwitch デベロッパー センターの「コードを操作する」 (bit.ly/inJ3DE) を参照してください。

高度なクエリ

LightSwitch アプリケーションは、データと画面がすべてなので、クエリを作成できるのも不思議なことではありません。Query Designer (クエリ デザイナー) では、フィルター、並べ替え、クエリ パラメーターの定義、クエリが返す行数の指定などが簡単に行えます。別のクエリを基にクエリを作成することも可能で、これは、一連のデータにフィルターや並べ替えを常に適用する必要があるときに便利です。また、必須パラメーターや省略可能なパラメーターを指定することもできます。ただし、クエリ デザイナーには制限もあります。デザイナー上部の [Write Code] (コードの記述) ボタンをクリックするか、[Properties] (プロパティ) ウィンドウの [Edit Additional Query Code] (追加クエリ コードの編集) をクリックして、PreprocessQuery メソッドのコードを記述できます。

Contoso Construction アプリケーションには、CurrentProjects というクエリがあります (図 9 参照)。CurrentProjects クエリは、デザイナーを使用して省略可能なパラメーターのみを定義します。それ以外のクエリは、コードで処理します。

The CurrentProjects Query
(クリックすると拡大表示されます)

図 9 CurrentProjects クエリ

このクエリでは、省略可能なパラメーターのみを定義し、フィルターや並べ替えを指定していません。したがって、パラメーターが提供されているかどうかを確認し、提供されていたら、値を評価してフィルターを適用する必要があるかどうかを判断する必要があります。PreprocessQuery メソッドには、クエリ自体だけでなく、デザイナーで定義するパラメーターが渡されます。つまり、デザイナーでフィルターを定義して句を並べ替え、その後フィルターまたは並べ替えをさらに行う LINQ コードを記述することでクエリを追加します。ただし、LightSwitch が想定するエンティティ型のコレクションを常に返す必要があります。プロジェクションや他の型を返すことはできません。

このため、PreprocessQuery メソッドでは、図 10 のようなコードを記述できます。

図 10 PreprocessQuery メソッドでのクエリのインターセプト

Private Sub CurrentProjects_PreprocessQuery(
  ShowAllProjects As System.Nullable(Of Boolean),
  ByRef query As System.Linq.IQueryable(Of LightSwitchApplication.Project))

  'If ShowAllProjects is False (or Nothing) then just pull up the 
  ' projects that do not have an actual end date specified. 
  If Not (ShowAllProjects.HasValue) Then ShowAllProjects = False

  If Not (ShowAllProjects) Then
    query = From p In query
            Where p.ActualEndDate Is Nothing
            Select p

  End If
End Sub

クエリに基づいて画面を作成したら、LightSwitch は、省略可能なパラメーターがあることを確認し、自動的にその画面のデータ項目を作成してクエリ パラメーターにバインドします。ShowAllProjects はブール値なので、チェック ボックスを作成します。ユーザーがそのチェック ボックスをオンにすると、クエリが自動的に実行されます。

LightSwitch はすべてにコード フックを提供します。クエリも例外ではありません。サンプル アプリケーションにおけるもう 1 つの興味深いクエリは、予算をオーバーしているプロジェクトを見つけるために集計を使用するものです。このクエリはデザイナーでは何も指定しません。子データを集計して、プロジェクトの建築資材にかかるコストを計算する必要があるため、コードのみを使用します。

Private Sub ProjectsOverBudget_PreprocessQuery(
  ByRef query As System.Linq.IQueryable(Of LightSwitchApplication.Project))

  'Return projects where the cost is over the original estimate
  query = From p In query
          Let cost = p.Labor + 
            (Aggregate m In p.ProjectMaterials Into Sum(m.Quantity * m.Price))
          Where cost > p.OriginalEstimate
          Order By p.StartDate
          Select p
End Sub

サンプル アプリケーションでは、ユーザーが Excel に結果をエクスポートして、データを分析しレポートを作成できるように、これら 2 つのクエリが [Search Data Screens] (データ検索画面) に表示されます。これらのレポートは頻繁に使用されるため、ハードコーディングしてもかまわないでしょう。ですが、ユーザーが独自のカスタム レポートを定義できるようにすることをお勧めします。このためには、完全なソース コードを含むサンプル ギャラリーから入手できる Filter Control 拡張機能を bit.ly/fYmEnK (英語) からインストールするだけです。

拡張機能を使用する

LightSwitch の拡張機能は、Visual Studio の他の拡張機能と同じようにインストールします。インストールする VSIX ファイルをクリックして、Visual Studio を再起動します。自身の LightSwitch のプロジェクトのプロパティを開くと、プロジェクトで使用する拡張機能を選択できる [Extensions] (拡張機能) タブがあります (図 11 参照)。

Enabling an Extension on the Extensions Tab of the LightSwitch Project Properties

図 11 LightSwitch のプロジェクトのプロパティの [Extentions] (拡張) タブでの拡張機能の有効化

Filter Control 拡張機能を使用するには、クエリを作成して、FilterTerm という文字列パラメーターを 1 つ追加し、PreprocessQuery メソッドに次のコードを追加します。

query = LightSwitchFilter.Server.Filter(query, FilterTerm, Me.Application)

次に、クエリに基づいて画面を追加して、スクリーン デザイナーで、FilterTerm コントロールのコントロールの種類を [Advanced Filter Builder] (高度なフィルター ビルダー) に変更し、ラベルの位置を [None] (なし) に変更します。Contoso Construction サンプル アプリケーションでは、クエリは CustomFilterProjects、画面は CustomReport といいます。

サンプル アプリケーションを実行して [Custom Report] 画面を開くと、フィルター ビルダー コントロールが表示されます。フィルターを定義し、[Go] ボタンを押すと、フィルターがサーバーに対して実行されます。このフィルターは、設計したフィルターの XML 表現を生成する Silverlight コントロールで、その後、クエリに文字列として渡されます。サーバーでは、クエリ コードが XML を解析して、適切なフィルター句を生成します。

もう 1 つの便利な拡張機能は、完全なソース コードと共に bit.ly/e580r3 (英語) から入手できる Excel Importer です。

LightSwitch には、データをグリッド形式で Excel にインポートするためのサポートが既に組み込まれています。Excel Importer は、Excel の列をエンティティのプロパティにマップすることで、スプレッドシートからデータをインポートすることを可能にします。この拡張機能は、サンプル アプリケーションの [Materials Catalog] 画面で使用しています。拡張機能をインストールして有効にしたら、編集可能なグリッド画面を作成して、[Screen Command Bar] (画面コマンド バー) にボタンを追加します。コマンドの Execute メソッドで記述する必要があるのは、次に示すコード 1 行のみです。

Private Sub ImportFromExcel_Execute()
  LightSwitchUtilities.Client.ImportFromExcel(Me.Materials)
End Sub

ご覧のように、追加機能を提供するために LightSwitch で拡張機能をインストールして使用するのは非常に簡単です。カスタマイズ内容を拡張機能としてパッケージ化する際、それを別の LightSwitch 開発者に広範囲に配布できます。

独自の拡張機能をビルドする

拡張機能をビルドするには、LightSwitch がインストールされている Visual Studio 2010 Professional SP1 以上のバージョン、Visual Studio SDK、および LightSwitch デベロッパー センター (msdn.com/lightswitch) からダウンロードできる LightSwitch Extensibility Toolkit が必要です。これにより、[新しいプロジェクト] ダイアログ ボックスの [LightSwitch] ノードに、Visual Basic および C# 用の拡張機能プロジェクト テンプレートが追加されます。

Contoso Construction アプリケーションに簡単なテーマを作成してみましょう。まず、新しい LightSwitch 拡張機能ライブラリ プロジェクトを作成して、これを「ContosoThemes」と名付けます。これで、拡張機能に必要なプロジェクトがすべて設定されます。LightSwitch アプリケーションの [File View] (ファイル ビュー) と似た追加のプロジェクト、つまり LSPKG および VSIX プロジェクトも含まれています。

次に、ContosoThemes.LsPkg を右クリックし、[追加] をポイントして [新しい項目] をクリックします。ここでは、サポート対象の一連の LightSwitch 拡張機能テンプレートが表示されます。[Theme] (テーマ) 項目を選択して、名前を付けます。ここでは、「PurpleTheme」にします。新しいテーマ用に事前に準備されている XAML ファイルが作成され、IDE で開きます。既定ではここに、標準のシェル テーマに存在しているすべてのブラシやスタイルがあります。LightSwitch がシェルに表示するすべての項目の色やスタイルを設定する場合は、どのようなツールを使用してもかまいません。この例では、XAML エディターを使用していくつかの色を変更し、[プロパティ] ウィンドウを使用して色を選択しました (図 12 参照)。

Creating a LightSwitch Theme Extension
(クリックすると拡大表示されます)

図 12 LightSwitch テーマ拡張機能の作成

拡張機能をテストする準備ができたら、F5 キーを押して、デバッグ IDE インスタンスを起動します。テーマをテストするには、このインスタンスで新しい LightSwitch プロジェクトを作成します。LightSwitch のプロジェクトのプロパティを開いて、[Extentions] (拡張機能) タブで、ビルドしたばかりの ContosoThemes 拡張機能を有効にします。次に、[General Properties] (全般プロパティ) タブに切り替えて、PurpleTheme を選択します。テーマが実行されているところを確認するためには、エンティティと画面を作成する必要があります。それから、テスト プロジェクトで F5 キーを押して、状態を確認します。

テーマに問題がなければ、リリース モードで拡張機能をビルドし、VSIX プロジェクトの \bin\Release フォルダーにある VSIX パッケージを LightSwitch 開発者に渡して、プロジェクトで使ってもらうことができます。広く配布するために、Visual Studio ギャラリーにアップロードすることもできます。図 13 では、テーマが Contoso Construction アプリケーションでどのように表示されるかを示しています。

Applying a Theme Extension to a LightSwitch Application
(クリックすると拡大表示されます)

図 13 LightSwitch アプリケーションへのテーマ拡張機能の適用

LightSwitch 拡張機能のビルドの詳細については、LightSwitch デベロッパー センターの「高度なトピック」を参照してください (https://msdn.microsoft.com/ja-jp/lightswitch/ff938857)。

まとめ

LightSwitch は機能の組み立てをすべて制御するため、データ中心のビジネス アプリケーションの開発を大幅に簡略化します。これにより、ビジネス ロジックと、ユーザーが仕事を効率的に実行するのに必要なカスタム機能の開発に専念することができます。さらに、LightSwitch の開発者、さらにはコミュニティ向けに LightSwitch 拡張機能をビルドすることを考えているプロフェッショナルの開発者は、さまざまなレベルのカスタマイズを実行できます。この記事をお読みいただき、LightSwitch がどれ程柔軟でカスタマイズ可能かをおわかりいただけたら、さいわいです。LightSwitch デベロッパー センター (msdn.com/lightswitch) では、情報、トレーニング、サンプル、ビデオ、フォーラム、コミュニティなどをご覧いただけます。

それではお楽しみください。

Beth Massi は、Windows Azure、Office、SharePoint 用の Visual Studio ツールや Visual Studio LightSwitch をビルドする、Microsoft Visual Studio BizApps チームのシニア プログラム マネージャーです。Massi は、ビジネス アプリケーション開発者コミュニティの推進者で、BizApps チームのオンライン コンテンツやコミュニティの対話を作成および管理する役割があります。彼女は、業界でビジネス アプリケーションの開発に 15 年以上携わっていて、ソフトウェア開発イベントで頻繁に講演しています。MSDN デベロッパー センター、Channel 9、ブログ (BethMassi.com、英語) などのさまざまな開発者向けのサイトでも活動しています。Twitter (twitter.com/BethMassi、英語) で彼女をフォローしてください。

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