次の方法で共有


Silverlight 開発: Silverlight を使用してビジネス アプリケーションを構築する

Silverlight は、基幹業務アプリケーションの開発と配置のための堅固なプラットフォームへと成熟しました。

Gill Cleeren および Kevin Dockx

マイクロソフトが Silverlight を世に出してから、わずか 3 年が経過しました。私たちがマイクロソフトの新しいリッチ インターネット アプリケーション (RIA) プラットフォームである Silverlight の最初のバージョンを目にしたのは、ラスベガスで開催された Mix07 でのことでした。今では、Silverlight は、ビジネス アプリケーションの構築と保守に適したプラットフォームへと成熟しました。

Silverlight 1.0 のプログラミング モデルは、XAML と JavaScript に基づいていました。JavaScript はエンタープライズ アプリケーションの構築に最適ではありません。そのため、この最初のバージョンは主にメディア中心のシナリオで使用されました。Silverlight 2 がリリースされると、このプラットフォームは基幹業務 (LOB) アプリケーションの開発を行う際の重要な選択肢になりました。最も重要な変更点は、JavaScript の代わりに .NET (C# または VB.NET) でコーディングできるようになったことです。

Silverlight が LOB アプリケーションの構築にどの程度適しているかを "テスト" するために、標準的なビジネス アプリケーションの要件を短いリストにしました。Silverlight がこうした要件を満たすことができるかどうか確認してみましょう。

データ、データ、データ

ビジネス アプリケーションについて考えるとき、何が思い浮かびますか。データは最も重要です。Silverlight アプリケーションはクライアント側 (ブラウザー内) で動作します。ですが、データはサーバー側のデータベース内にあります。Silverlight の名前空間とアセンブリは ADO.NET をサポートしていないので、DataReader や LINQ to SQL などのよく知られた機能をサポートしていません。

また、Silverlight はクライアント側のデータベースを持ちません。多くの場合、クライアント側のデータベースを持つことが適切な解決策でないことも事実です。機密情報が格納されたデータベースの一時的なコピーを間違ってクライアントのコンピューターに格納してしまうことは当然避けたいでしょう。

解決方法は単純です。データベースの上にサービス層を追加するのです。このサービス層を使用して、(できればビジネス層を通じて) データベースに接続することができます。その後、クライアント側で、Silverlight がこうしたサービスに接続し、データにアクセスすることができます (図 1 参照)。

図 1: Silverlight はクライアント側でサービスに接続できる

図 1 Silverlight はクライアント側でサービスに接続できる

Silverlight は、種類が ASMX、WCF、および REST のサービスをサポートしています。Silverlight を使用して、ソケットや net.tcp など、より珍しい種類のサービスを利用することもできます。エンタープライズ内の既存のテクノロジ スタックに Silverlight を追加しようとしている方にとって、これは朗報です。Silverlight でデータの取得先として使用できるサービスは、他の種類のアプリケーションで使用するものと同じです。

Silverlight では、ASMX サービスを処理するのと WCF サービスを処理するのは似ています。サービスを実装する場合、既定では WCF を選択する必要があります。WCF サービスへの接続の基本的な例を見てみましょう。最初のステップは、サービスが行う処理を定義することです。このサービスは製品のリストを返します (次のコード参照)。

[ServiceContract(Namespace = "")]
publicclassOrderService
{
[OperationContract]
publicList<Product> GetAllProducts()
        {
...
        }
    }

サービスの準備ができたら、Silverlight と接続することができます。これを行うには、Visual Studio からサービス参照を追加します (図 2 参照)。

図 2: Visual Studio を使用して Silverlight にサービス参照を追加する

図 2 Visual Studio を使用して Silverlight にサービス参照を追加する

Visual Studio によってプロキシ クラスが作成されます。プロキシ クラスは、サービス クラスのクライアント側コピーであり、メソッドの実装がサービス メソッドの呼び出しに置き換えられたものと考えることができます。Silverlight のサービス通信はすべて非同期に行われます。次のコード例では、このプロキシを使用して製品のリストを取得しています。

privatevoid button1_Click(object sender, RoutedEventArgs e)
{
OrderService.OrderServiceClient proxy = new OrderService.OrderServiceClient();
       proxy.GetAllProductsCompleted += newEventHandler<OrderService.GetAllProductsCompletedEventArgs>(proxy_GetAllProductsCompleted);
       proxy.GetAllProductsAsync();
}

void proxy_GetAllProductsCompleted(object sender, OrderService.GetAllProductsCompletedEventArgs e)
{
ProductGrid.ItemsSource = e.Result;
}

REST は、Facebook や Twitter などの Web 2.0 API で盛んに採用されているため、現在人気のあるプロトコルです。REST は Silverlight でも完全にサポートされています。また、Silverlight には、n 層の Silverlight アプリケーションを特に念頭に置いて開発された WCF RIA Services というサービス フレームワークがあります。

n 層に入る

Silverlight アプリケーションを作成する場合、通常はサービス層を通じてデータを取得します。しかし、特別な設定を行わずに、検証、認証/承認などを含むデータ転送用のオブジェクトやクラスを単純に一度だけ記述する簡単な方法はありません。Silverlight アプリケーションは、制限付きのバージョンの Microsoft .NET Framework 4 に基づいて構築されます。そのため、Silverlight アプリケーションでは、完全な .NET Framework 4 に基づいて構築されたアセンブリ (クラス/検証ロジックを含むアセンブリなど) を参照することはできません。

ここで役立つのが WCF RIA Services です。WCF RIA Services は、LOB RIA の開発を容易にするために作成されました。WCF RIA Services は、サーバー側とクライアント側の両方でフレームワーク、コントロール、およびサービスを提供することで、n 層アプリケーションの構築の複雑さに対処します。

WCF RIA Services を使用すると、サーバー側のデータ ストアにリンクされたサービスを記述することができます。データ ストアは、SQL Server データベースでも、独自の POCO クラスでも、Entity Model でもかまいません。その後、クライアントでこうしたエンティティが再生成されます。次に、サービスと容易に通信するために必要なコンテキスト、メソッド、および処理がクライアントで生成されます。

Entity Framework になじみのある方にとっては、WCF RIA Services は使いやすいでしょう。実際のところ、WCF RIA Services では Entity Framework と同じようにコーディングすることができます。たとえば、変更セットを追跡し、エンティティのリストを保持し、こうした変更の送信を可能にする、クライアント側の DomainContext を用意することができます。これにより、サービス層を通じて処理を行っているという事実が "隠ぺい" されます。

WCF RIA Services は本質的に、クライアントにコードを提供するサーバー側テクノロジです。また、WCF RIA Services を使用すると、サービスやエンティティに検証や承認/認証の処理を追加するのが容易になります。WCF RIA Services を使用すると、LOB Silverlight アプリケーションの構築にかかる開発期間が大幅に短縮されます。

コントロールの問題

Silverlight には、Button、TextBox、ComboBox などの単純なコントロールを含む拡張されたコントロール セットが用意されています。また、DataGrid、RichTextBox、MediaElement などのより高度なコントロールも既定のインストール パッケージに多数含まれています。バージョンを追うごとに、コントロールがさらに追加されていきます。

また、マイクロソフトは Silverlight コントロール ツールキットを作成しました。これは追加のコントロールのセットで、CodePlex.com (英語) を通じて無償で入手でき、オープン ソースです。このパッケージはかなり頻繁に更新され、通常の Silverlight リリースとは別に提供されます。

このツールキットには、Silverlight エンタープライズ開発者の労力をさらに軽減する多くのコントロールが含まれています。次の要件であるレポートで役立つグラフ作成コントロールもあります。

印刷できるかどうか

印刷は依然として、要求されることの多いビジネス要件です。Silverlight 4 では、Silverlight から直接印刷できるようになりました。この API を使用すると、印刷対象が画面全体であれ、レポートなどの動的に生成されたコンテンツであれ、印刷対象を指定することができます。そのため、Silverlight 4 とツールキットに含まれているコントロール (充実したグラフなど) とを組み合わせると、簡単にレポート ソリューションを作成することができます。

パターンとベスト プラクティス

Silverlight ベースまたは XAML ベースのアプリケーションを作成する際に考慮しなければならない重要事項の 1 つは、推奨されるコード記述法が ASP.NET や Windows フォームなどの古いテクノロジで慣れ親しんできたコーディング方法とどのように違うかです。同じ方法でコードを記述することもできますが、それは推奨されません。同じ方法では、テクノロジの力を最大限に利用することはできないためです。

Silverlight アプリケーションは、DataContext、データ バインド、およびオブザーバーのパターンに大きく依存する必要があります。TextBox の値をオブジェクトに割り当てたり、逆にオブジェクトの値を TextBox に割り当てたりする反復的なコードは避ける必要があります。このようなコードを記述すればするほど、コードにバグが入り込む可能性が高くなります。オブジェクトを UI 要素にバインドすると、コードでオブジェクトを通じて自動的に適切な値を使用できるようになります。実際のところ、UI 要素に直接アクセスすることは避ける必要があります。

ここで役立つのが Model-View-ViewModel (MVVM) デザイン パターンです。このパターンは、問題の分離を促進するためによく使用されます (分離コードには、コードはほとんどまたはまったく含まれません)。このパターンを使用すると、開発者とは別にアプリケーション UI に取り組むことができます。また、このパターンは、コードのテスト容易性を向上させるのにも役立ちます。

ですが、このパターンの最も重要なメリットは、開発者による、DataContext とデータ バインドのテクノロジの力の利用が促進されることです。View には ViewModel が DataContext として設定されており、この DataContext にはすべてのデータ プロパティが含まれます。

こうしたプロパティはデータ バインドを通じて View の UI 要素にバインドされます。したがって、ViewModel は基本的に、Model (データのオブジェクト表現) から取得したデータを View で使用できるデータに変換します。ViewModel は強力なコンバーターと考えることができます。

この準備が整ったら、イベント (ボタン クリックなど) を View の分離コードではなく ViewModel に中継する方法が必要となります。これはコマンドによって行います。Silverlight は ICommand インターフェイスを提供しており、ボタンの基礎を継承する UI 要素を Command にバインドすることができます。こうしたコマンドは ViewModel で定義されます。

次は、異なる ViewModel が互いに参照することなく通信する方法が必要となります。これは、ブロードキャスト/リッスンの原則を通じて行うことができます。ViewModel サブスクライバーは特定の種類のメッセージを受信し、一方、別の ViewModel は別のメッセージを送信します。メッセージを受信したら、必要な処理を行うことができます。

最後に、View が適切な DataContext を把握するようにする必要があります。View 第 1 のアプローチ (View がアプリケーションによってインスタンス化され、その View に必要な ViewModel のインスタンス化は View の役目となる) と ViewModel 第 1 のアプローチ (その逆) という異なるアプローチがあります。これらのアプローチでは、IoC コンテナーまたは Managed Extensibility Framework (MEF) が役目を繰り返し遂行するのによく使用されます。

MVVM には、非常に多くの異なる実装があります。独自に記述することもできますが、オープン ソース コミュニティでは、MVVM Light Toolkit、Caliburn、Prism などの優れた実装が既に提供されています。

ご覧のとおり、Silverlight はエンタープライズ レベルのアプリケーションの構築に適しています。実際、私たちは 2 人とも、毎日のように Silverlight でエンタープライズ レベルのアプリケーションを構築しています。

Gill Cleeren

Gill Cleeren は Microsoft Regional Director (theregion.com (英語)) であり、ASP.NET の MVP です。また、INETA 講演者事務局のメンバーであり、Silverlight の事情通でもあります。ベルギーに在住し、Ordina で .NET アーキテクトとしての職務に従事しています。開発者向けのさまざまな雑誌で記事を多数執筆しており、最近、初めての著書である『Microsoft Silverlight 4 Data and Services Cookbook』(Packt Publishing、2010 年) を出版しました。彼のブログは http://www.snowball.be/ (英語) で公開されています。

 

Kevin Dockx

Kevin Dockx は、ベルギー最大の ICT 企業の 1 つである RealDolmen で .NET Web アプリケーションに関するテクニカル スペシャリスト/プロジェクト リーダーを務めています。主な研究分野は Silverlight 全般ですが、Microsoft .NET (Web) スタックのその他の製品に関する新展開にも目を配っています。オランダで開催された Microsoft DevDays、ポルトガルで開催された Microsoft Techdays、BESUG (Belgian Silverlight User Group) のイベントなど、国内外のさまざまなイベントで頻繁に講演を行っています。Silverlight や .NET に関するさまざまなとっておきの情報が掲載され、ときには雑談も掲載される彼のブログは、blog.kevindockx.com (英語) で公開されています。

 

関連コンテンツ