プレゼンテーション層
Visual Studioには、アプリケーションのユーザーインターフェイスの部分を、マスタ-詳細のリレーションシップを表示しながら作成できるData Formウィザードがあります。
ソリューションエクスプローラで、これまでに使用してきたのと同じプロジェクトを右クリックし、[Add new item]をクリックします(ここでは、Data Formウィザードでビジネスオブジェクトを検出するために同じプロジェクトを使用します。コードは後で移動します)。一覧からData Formウィザードを選択して、フォームの名前に「OrdersWin」などを指定します。
次の画面で、プロジェクトに含まれる既存のデータセットが検索されます。このデータセットを使うことも、この画面で新しく作成することもできます。ここでデータセットを作成してもまったく問題ありませんが、データ層とプレゼンテーション層を混ぜると、N層アプリケーションのセオリーに反することになるので、ここではそのためにデータオブジェクトとビジネスオブジェクトを別に作成しています。

OrdersBOを選択すると(データオブジェクトではなくビジネスオブジェクトであることに注意)、ビジネスオブジェクト内に作成されている入力と更新のメソッドが一覧表示されるので、その中から、データセットの入力と更新に使うメソッドを選択します。

DataSetに複数のテーブルがある場合、ウィザードは画面をもう1つ表示します。この画面では、マスタテーブルと詳細テーブルを選択します。また、フォームに追加するフィールドも選択できます。

最後に、1つの親をフォームビューに表示するのか、複数の親をグリッドビューに表示するのかを選択します。子レコードは画面下部のリンクされたグリッドに表示されます。
生成されるフォームは図7のようになります。このプロジェクトを実行すると、「Orders」と「Order Detail」の情報を操作するためのフォームになります。
ウィザードの最後のオプションで、親を1つだけ表示する設定にした場合は、1対多のリレーションシップを表示するフォームになり、Ordersレコードの間を移動するためのコントロールと、必要に応じてレコードを編集するためのコントロールが追加されます(図7を参照)。
アプリケーションをビルドして実行すると(プロジェクトのプロパティはOrdersWinフォームを起動するように設定しておきます)、最初にマスタ-詳細フォームが表示されます。リンクがどのように実行されたかを確認してください。詳細のグリッドのデータソースがobjOrdersBOに設定され、データメンバがデータセットのリレーションシップ名であるOrders.OrdersOrder_x0020_Detailsに設定されたことがわかります。
以上のように、このアプリケーションはわずかなコードを記述するだけで簡単に作成できます。これなら経験の浅い開発者でもアプリケーションをすぐに構築できますし、3層アーキテクチャの個々の層を分離することができます。
生成されるコード
ウィザードのコード生成機能により、各コントロールをデザインサーフェイスにドラッグしてプロパティを適切に指定したときと同じように、以下のコードが生成されます。
- テーブル内の個々のフィールドを表すラベルおよびテキストボックスコントロール。それぞれのコントロールに、データ行のフィールドにバインドした適切な名前が割り当てられます。
- データの読み込み、およびレコードの更新、追加、削除を行うためのボタン。
- レコード間の移動を処理するためのボタン。
- リレーションシップを持つ子レコードを表示するグリッド。子レコードへのリンクも設定されます。
- グリッドの各列のテーブルスタイル。
- 各ボタンのクリックイベントを処理するメソッド。
- データを読み込むメソッド(ベースメソッドを呼び出します)。
- データセットを更新するメソッド。データバインドを効率的に処理するマージメソッドを利用します。
これらのコードのほとんどは、ビジュアルツールを使っても生成できますが、このウィザードを使用すれば20~30分を節約できるうえに、優れたコーディングパターンが組み込まれます。生成されたコードは、合計でおよそ190行になりました。
一方で、このウィザードは非常に気難し屋です。このウィザードは、ビジネスオブジェクトクラスにすべてのプロパティを過不足なく作成しておかないと、そのクラスを検出してくれません(正しい組み合わせは、筆者もまだ確実にはわかりません)。また、入力と更新のメソッドには必ず正しいシグネチャを指定する必要があります。それができたとしても、グリッドが正しく生成されるとは限りません。
層の分離
分離する層は、アプリケーションの開発を始める前に作成しておくのがベストです。Windowsプロジェクトのすべての要素が用意できたら、「NorthwindBiz」という名前で新しいクラスライブラリプロジェクトを作成し、OrdersDOオブジェクトとOrdersBOオブジェクトをこのプロジェクトにドラッグアンドドロップしてください。次に、「OrdersWin.vb」ファイルから「NorthwindWin」の記述を探して「NorthwindBiz」に書き換えます。また、NorthwindBizプロジェクトへの参照をNorthwindWinプロジェクトに追加することも必要です。この2つの簡単な変更で、新しいフォームを前と同じように実行できます。また、同じビジネスロジックを使用するWebインターフェイスを追加するためのプロジェクトを追加することもできます(残念ながら、Webアプリケーション用のData Formウィザードはまだないので、このバージョンを実現するにはもう少し手間がかかります)。
まとめ
現在ではアプリケーション生成のための優れたフレームワークやコード生成ツールが数多く販売されていますが、そのほとんどは、時間とお金をかけなければうまく使いこなすことができません。私はVisual Studio付属の生産性向上ツールを好んで使用しますが、このツールが展開するお粗末なプログラミング手法には満足していません。本稿で説明した手順がこの問題の解決に役立つはずです。
OrdersBOクラスにコードをさらに追加して、検証を実行したり、その他のビジネスロジックを実装したりすることもできます。
本稿では、正しく設計された実用的なアプリケーションモジュールを、およそ20分間で作成しました。生成したコードは1000行を超えましたが、自分で作成したコードはわずか10行ほどでした。


