技術解説

PetShopで学ぶデータベース・アクセスの実装パターン

デジタルアドバンテージ
2004/03/27

Page1 Page2 Page3 Page4

PetShopの論理アーキテクチャ

 続いてはPetShopの論理アーキテクチャについて、その概要をまとめておく。下の図はPetShopの論理アーキテクチャを図示したものだ。PetShopのアプリケーション構造は、プレゼンテーション層、ビジネス層、データ層の3つの層に分割できる。

 まずプレゼンテーション層では、ASP.NETのWebフォームによる「ユーザー・インターフェイス・コンポーネント」を提供する。このコンポーネントは主に、画面を定義している.aspxファイルと、それを制御するコードビハインドのファイルで構成される。

 さらにPetShopでは、セッションを通じて保持されるショッピング・カート情報とアカウント情報(サインインしているユーザーの個人情報)を扱うモジュールを「カート・コントローラ」「アカウント・コントローラ」として、それぞれクラスにまとめている。これは、セッション状態の管理をユーザー・インターフェイスから分離していることを意味しており、これにより、セッション状態をWebサーバとは別のサーバで管理することも容易になっている。さらには、ユーザー・インターフェイス部分をWebフォームではなくWindowsフォームなどで置き換えることも容易となる。これら2つの「コントローラ」は「ユーザー・プロセス・コンポーネント」として分類され、「ビュー」であるユーザー・インターフェイス・コンポーネントとは区別される。

 プレゼンテーション層は、次に述べるビジネス層にあるコンポーネントのみを利用する。

PetShopの論理アーキテクチャ
各層に含まれるコンポーネントの役割や特徴については、「連載:アプリケーション・アーキテクチャ設計入門」で詳しく解説されている。

 ビジネス層のコンポーネントは、PetShopでは大きく2つに分かれる。1つはビジネス・ロジックを実装している「ビジネス・ロジック・コンポーネント」である。これらは例えば、「オーダーの追加」「オーダーの取得」「商品の取得」「商品の検索」といった機能を提供する。

 そしてもう1つは「ビジネス・エンティティ・コンポーネント」である。このコンポーネントでは、「オーダー情報」「商品情報」「アイテム情報」「アカウント情報」などのエンティティ(実体、存在)を表現するクラスを定義している。ここで定義されたクラスが、データ層からプレゼンテーション層まで全域にわたって利用されることになる。.NETではこのような目的のためにデータセット(System.Data名前空間のDataSetクラス)が利用されることもあるが、PetShopでは各エンティティを表現する個々のクラスを定義している。

 最後のデータ層は、データベースをアクセスするための「データ・アクセス・コンポーネント」で構成される。このコンポーネントは、例えば「商品テーブル」からレコードを取得し、それをビジネス・エンティティの1つである「商品情報」としてビジネス・ロジック・コンポーネントに返す。あるいは、ビジネス層から「オーダー情報」を受け取り、それをオーダー・テーブルに挿入したりする。

 PetShopでは、以上3つの層は完全に分離されている。各層の間でのデータの受け渡しはビジネス・エンティティ・コンポーネントで定義されたクラスのオブジェクトにより行われる。

 データベース管理システム(DBMS)として「SQL Server 2000」と「Oracle 9i」の2つが利用可能であるが、データ層はビジネス層と分離しているため、ビジネス層のコードをまったく変更せずに、DBMSを切り替えることができる。実際、PetShopでは実行時に(再コンパイルなしに)アプリケーションの設定ファイルである「Web.Config」ファイルの書き換えだけで、これが可能となる仕組みを持っている(詳細は後述)。

 またPetShopは、.NETの「COM+サービス」を用いた分散トランザクションの利用方法を示すために、オーダーに関する処理を2つの異なるデータベースに対して行えるようになっている。本稿では分散トランザクションについての解説は割愛するが、Web.Configファイルの設定により、SQL ServerとOracleを混合した運用も可能となっている。

 なお、ここまで登場した各層のコンポーネントの役割や特徴や、.NETにおけるアーキテクチャ設計については、「連載:アプリケーション・アーキテクチャ設計入門」で詳しく解説されているので、そちらも参照していただきたい。

PetShopのファイル構造とクラス構造

 ここからは、特にビジネス層とデータ層を中心に、PetShopでの具体的な実装について見ていく。

 まずはアプリケーションを構成するファイル構造から。PetShopは次の図のようなディレクトリ構造でインストールされる。先に示したコンポーネントごとにディレクトリが作成され、ソース・ファイルが分けられている。

PetShopのインストール後のディレクトリ構造
コンポーネントごとにディレクトリが作成され、ソース・ファイルが分けられている。

 アプリケーションの具体的なコンポーネントは、この中でも次の表で挙げた6つのディレクトリにあるファイルで実装されている。

ディレクトリ名 含まれるファイルで実装されている内容
BLL ビジネス・ロジック・コンポーネントを実装するクラス群(BLLはBusiness Logic Layerの略)
Model ビジネス・エンティティ・コンポーネントを実装するクラス群
DALFactory Web.Configファイルに従って、データ・アクセス・コンポーネントのオブジェクトを作成するためのクラス群(DALはData Access Layerの略)
IDAL データ・アクセス・コンポーネントを実装するときに使用されるインターフェイス群
SQLServer SQL Serveにアクセスするためのクラス群(これらのクラスはIDALディレクトリにあるインターフェイスを実装している)
Oracle Oracleにアクセスするためのクラス群(これらのクラスはIDALディレクトリにあるインターフェイスを実装している)
コンポーネントを実装しているファイルのディレクトリ一覧

 さらに、各ディレクトリに含まれているファイルと、そのファイルで定義されているクラス(IDALディレクトリではインターフェイス)の一覧を以下の表にまとめた。クラス部分では、コロン(:)で区切って、継承している基本クラス、あるいは実装しているインターフェイスも示している。なお、すべてのファイルにおいて、1つのファイルには1つのクラスあるいは1つのインターフェイスしか定義されていない。このため、ファイルの数は少し多い。

 まずは、BLLディレクトリとModelディレクトリである。

各ディレクトリのファイルと、そのファイルで定義されているクラス

 Modelディレクトリにあるファイルでは、すべてのクラス名の最後に「Info」が付いている。これらのクラスのオブジェクトにより、3つの層でビジネス・データがやり取りされる。

 残りの4つのディレクトリにあるファイルは、

  • データ・アクセス・コンポーネントのオブジェクトを生成するための「ファクトリ・クラス」
  • データ・アクセス・コンポーネントに必要なメソッドを記述したインターフェイス定義
  • 上記のインターフェイス定義を実装した、データベースにアクセスするクラス

の3つで1つのセットとなっている。3番目の「データベースにアクセスするクラス」としては、SQL Server用とOracle用の一連のクラスがある。

各ディレクトリのファイルと、そのファイルで定義されているクラス

 具体的な内容は例を挙げて後述するが、SQLServerおよびOracleディレクトリの各クラスは、IDALディレクトリのインターフェイスで定義されている一連のメソッドを実際に定義したクラスである。これらのクラスは、表の一番下にあるヘルパー・クラス(SQLHelperあるいはOraHelper)のメソッドを利用してADO.NETの機能を使用する。

 DALFactoryディレクトリの各クラスは、Web.Configファイルの設定に従って、SQL Server用かOracle用かどちらかのクラスを実行時にロードし、そのインスタンスを生成するメソッドのみを持っている。

 この生成メソッドを呼び出すのは、BLLディレクトリのクラスである。生成されたインスタンスに対しては、データベースにアクセスするメソッドをインターフェイス経由で呼び出せるので、それがSQL Server用かOracle用かを意識する必要はない。そしてもちろん、それらのメソッドが返すデータは、Modelディレクトリのクラスのオブジェクトである。

 今回の解説ではそれほど必要ではないが、PetShopで使用されるテーブルの一覧も次に示しておく。ビジネス・エンティティであるModelディレクトリのクラスや、データ層の各クラスが実際のテーブルとは必ずしも1対1になっていない点には少し注意が必要である。

PetShopで使用されるデータベースのテーブル
この図では、インストール時に設定されるテーブル間のリレーションも示している。

 これらのテーブルに加えてSupplierという名前のテーブルも作成されるが、このテーブルはプログラムでは使用されていないようである。


 INDEX
  [技術解説] PetShopで学ぶデータベース・アクセスの実装パターン
    1.PetShopアプリケーションの概要
  2.PetShopの論理アーキテクチャとファイル構造
    3.データベースからUIまでのデータの流れ(1)
    4.データベースからUIまでのデータの流れ(2)
 


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間