データベース系の実装を如何にするかで悩んだ(2)

データベース系の実装を如何にするかで悩んだの続き。
方針:
・使う側(実装者)から見て、具体的な型(Type)を意識しないで使えるようにする。
・接続文字列は一箇所に記述すれば良いようにする。みんなで其処を参照する。
・接続とトランザクション、クエリ実行は分けて考える。

○具体的な型(Type)を意識しないで使えるようにする
具体的な型を意識させない、という事は、

new SqlConnection(...)

とか

new SqlTransaction(...)

とか

new SqlCopmmand(...)

等を実装者側に記述させないということになる。生成する為のメソッドを用意して、
それを使ってもらうようにするしかないか。戻り値のタイプをインターフェースにする。
○接続文字列は一箇所に記述すれば良いようにする。みんなで其処を参照する。
(案1)設定ファイルに書く
→変更には強い。いちいちビルドし直す必要はない。
 本番用設定ファイル、開発用設定ファイルを分けて作れば、逐一切り替える必要もない。
→接続先情報(パスワード)が丸見えなので、配置するフォルダに参照権限をつけておく必要がある。

(案2)staticクラスにstaticな文字列(或いはconst)で定義する。
→変更に弱い。接続先を変えるだけでもビルドが必要になる。
→開発に使用するDBと本番運用を行うDBは大抵違うサーバだから、逐一切り替える必要が有る。
 変え忘れによる、開発環境から本番DBへの更新、本番環境から開発DBへの更新というリスクがある。
→接続先情報がコード内に隠される。
大体において、案1が使われるかな。1人で開発する規模であれば、案2でも十分いけるけど。

○接続とトランザクション、クエリ実行は分けて考える。
接続とトランザクション制御1回分で、クエリ実行が1回だけとは限らない。
同じ接続で使用するDAO系クラスの数も1つとは限らない。
・接続とトランザクションを管理するクラス(例:DbConnectionManager)
・SQL実行に必要なオブジェクトを生成するクラス(例:DbProviderFactory)
・SQL実行を呼び出すクラス(例:DbTableDao)
に分けるようにする。
役割に必要なメソッドを考える。
(1)DbConnectionManager
→接続を管理するのだから、
・OpenConnection
・CloseConnection
は必須。
また、トランザクションを制御するのだから、
・BeginTransaction
・Commit
・Rollback
は必須かな。

(2)DbProviderFactory
→オブジェクト生成が役目だから、各プロバイダオブジェクトを生成する。
どのProviderクラスタイプを使うかは、DBMS次第なので、DBMS毎に派生クラスがあれば行けるかな。
・IDbConnection
・IDbCommand
・IDbDataAdapter
・IDbDataParameter
・[不要]IDbTransaction(IDbConnection.BeginTransactionで取得可能)
・[不要]IDataReader(IDbCommand.ExecuteReaderで取得可能)

(3)DbTableDao
→DAO系の基底クラスにしたいので、
・検索クエリ
・更新クエリ
・登録クエリ
・削除クエリ
・ストアドプロシージャ
を実行するメソッドが最低欲しいところ。
タイムアウト設定やロックタイムアウト設定もできればなおよしかな。
この3クラスを連携させれば、なんとかなりそうかな。

この記事の続きがあるので、リンクを貼っておく。
既に標準装備だったとは・・・
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: C# | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m