データアクセスレイヤの設計

先日の日記では拙作のフレームワークにおけるデータアクセスレイヤを検討した。いつまでも妄想する訳にもいかないので大体の方針を決めることにする。

  • ピア層

ADO.NETをそのまま使う。データプロバイダに関してはOracleを使うのでODP.NETを使うという話が出たが、ロックインは避けるためにも汎用のデータプロバイダを使うこととする。

  • インタフェース(DAO)層

S2Daoのようにエンティティとバインドされたインタフェースを逐一用意することも考えたが、エンティティと対にインタフェースが増えていくのは避けたかったので、C#2.0のジェネリクスを生かして総称的なDAOインタフェース一つだけを定義して使うことにする。
DAOはピア層のADO.NETのインタフェース

    • IDataReader
    • IDbCommand

等を入力としてそこからエンティティを取得したり、逆にエンティティを入力してデータベースを更新したりする操作を定義する。
SQLは文字列プロパティ又は外部ファイルに記述することとして、DIコンテナ経由で外部からインジェクションできるように作る。

  • エンティティ層

.NET C#はカスタム属性というクラスでアノテーションを非常に簡単に扱える。それを活用するためにもこの層のオブジェクトはS2Daoと同様にアノテーションによりそのプロパティとバックエンドのデータベースをバインドできるようにする。ただし、最初はそれほど機能が必要な訳ではないので以下のように限定した実装になるだろう。

    1. オブジェクトのフィールド(プロパティ)とデータベースフィールドの紐付けを行う
    2. オブジェクト(クラス)とデーターペーステーブル(DataTable)との紐付けを行う
    3. ネストしたオブジェクト(N:1等)のマッピングは実装しない
    4. ID値の自動生成機能は実装しない
    5. バージョニングの為の仕組みは実装しない(DAO層から上に任せる)

DAOのポリシとしては、オブジェクトをデータベースにマッピングするのではなく、クエリ(の結果)にマッピングするものとして実装する。
結果としてはThe CodeProject記事のサンプルをベースにS2Daoの機能を繰り込む形となりそうだ。