では、Visual Studio 2005が実際に使用している「属性」の例を見ながら、もう少しその恩恵について理解を深めていきましょう。
例えば、.NETにおけるWebサービス(XML/HTTP/SOAPなどのインターネット標準技術を利用してアプリケーション間で情報交換をおこなう、画面を持たないソフトウェア部品)の開発においては、Visual Studio 2005に組み込まれているテンプレートからプロジェクトを作成することで、以下のようないくつかの「属性」が挿入されたコードを出力します。そしてこのコードは、何も変更せずにそのままビルドしてWebサービスとして動作させることができます。
Visual Studioが作成したWebサービスの実装コード(C#)
using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Service : System.Web.Services.WebService
{
public Service () {
//デザインされたコンポーネントを使用する場合、次の行をコメントを解除してください
//InitializeComponent();
}
[WebMethod]
public string HelloWorld() {
return "Hello World";
}
}
Webサービスは、サーバ側では次のように動作します。
クライアントアプリケーションがasmxの拡張子のファイルにアクセスすると、リクエストはサーバ側でASP.NETのDLL(aspnet_isapi.dll)にアタッチされ、ワーカープロセスと呼ばれるプロセスにリクエストを転送し、そのプロセスの中で.NETのクラスであるWebServiceHandlerクラスのインスタンスが生成されてリクエストが処理されます。
そして一連のパイプラインにより、WebServiceHandlerクラス以外にも様々なクラスが利用されていきます。ハンドラは、以下のコード(キーワード)が記述されたasmxのファイルの中を見て、ここに記述されているクラス(この例の場合は「Service」クラス)のWebMethod属性のメソッドをWebサービスで使用されるメソッドと判断して、必要なXMLシリアライズの処理などを呼び出します。
<%@ WebService Class="Service" %>
こうして、WebServiceやWebMethodなどの「属性」をキーワードとして、面倒な作業をこの一連の処理系が内部で行ってくれます。ですから開発者は、これらの「属性」をキーワードとして使うだけで、XMLシリアライズなどの処理のいっさいを記述しなくてもよいのです。
これらの仕組みを使用せずにWebサービスを自前で作成する場合を想像してみてください。WSDL(Webサービス記述言語)と呼ばれるXMLスキーマに準じた応答処理など、すべて自前で構築することを考えると、それがいかに途方もない作業であるかは容易に想像できるでしょう。「属性」はこういった場面で活躍しています。
さて、上記はWebサービスの例でしたが、ASP.NETではWebフォーム(画面を持ったWebのページ)においても魅力的なフレームワークを提供しています。例として以下のようなアプリケーションを作成してみましょう。
- テキストボックスとボタンとリストボックスを持ったフォームを作成
- テキストボックスに入力された文字をデータベースから検索
- リストボックスに検索結果を挿入
表1:簡単なアプリケーションの例
ASP.NET以前であれば、表1の処理を実装するためには、ボタンを押した後の画面遷移、遷移後のサーバ側でのデータベース検索、検索結果をリストに設定してWebページを作成という段階を踏む必要がありました。さらには、リストに挿入されている値の内容が2回目以降もクリアされてしまわないよう、ページを遷移するたびにデータを受け渡す特別な仕組み(例えば、hiddenと呼ばれるinputタグに、ユーザに見えないように内部データを設定しておくなど)の構築も必要でした。
このように、今までは要件上の振る舞い以外にページがどう遷移するか、どのようなデータをページ間で渡すかなどのシステム的な振る舞いも構築する必要がありました。
しかしASP.NETでは、テキストボックスやリストボックスを持つページをHTMLのタグの入ったページ(厳密には、ASP.NET用のキーワードも含んだaspxという拡張子のページ)として作成したら、後は以下のようにボタンのClickイベントを実装して終了です(以下のコードは、わかりやすいように、データベース検索の箇所についてはコードを省略しています)。
Webフォームのイベント処理
protected void Button1_Click(object sender, EventArgs e)
{
// データベースからの値の検索
(中略)
// 検索結果の挿入
ListBox1.Items.Add(result);
}
見ての通り、ページ遷移やhiddenなどの面倒な処理はいっさい記述しません。これらも、ASP.NETの処理系がすべて実現してくれます。HTMLのタグなどマークアップ言語で記載したaspxファイルの中身も、内容の解析が行われ、ページのツリーとして.NETのILのコード(第1回を参照)に展開されます(注1)。
※注1:
Visual Studio 2005をお持ちの方は、作成したWebフォームを「このプリコンパイルされたサイトを更新可能にする」のチェックボックスを外してIISに発行してみてください。Default.aspxの中身を確認すると、タグの存在しない使用されていないファイルになっていることが確認できます。また、発行によりbinディレクトリに作成されたDLLを.NET Framework SDKのildasmコマンドなどで逆アセンブリすると、ASP.default_aspxクラスにページの構成がツリーの概念で生成されていることがコードで確認できます。
こうして生成されたクラスと、Webサービスでも見てきたような一連の処理系との協調作業によって、面倒な処理はすべて内部で自動的に行ってくれるのです。開発者はまるでWindows上のデスクトップアプリケーションを構築するかのように要件を実現する上での振る舞いのみに集中して開発を行うことができるようになっています。
|