
概要
RDBMSに接続してデータをストアしたりクエリしたりするアプリケーションを初めてまともに開発しています。Windowsデスクトップアプリです。
DBを使ったシステムの、非テーブルの部分(プログラミングコード部分)について、一般的にどのように設計すべきなのかがよくわかりません。
ググったところ「どうもDAOというのがあるらしい」「サービスがDAOを使うらしい」「DAOはテーブル毎に作る派閥とサービスI/Fに合わせて作る派閥があるらしい」的なことはわかってきたのですが、その先がなかなか進まないので、アドバイスを頂きたく思います。
環境
- C# / .NET6 / Visual Studio Professional 2022
- 本番PostgreSQL / ユニットテストSQLite
- Entity Frameworkは使っていません。今のところIDbConnection等をベタに使って、SQL文を手書きしています。
- WPF + DryIoc + 自作MVVMライブラリ
現時点での設計方針
- Data Access Objectというものが永続化(とクエリ?)を担当する。なのでDAOの実実装でSQL文を書く。
- サービスオブジェクトというものがDAOを操作する。サービスオブジェクトのpublicなI/Fでは、サービス利用側にはRDBMSは意識させない。
- DIコンテナでアプリケーションを構築したい。なのでDAOのinterfaceとか、サービスのinterfaceとかを定義する。サービスはDAOをinterface経由で操作する。
- サービスが利用するDAOは、サービスのConstructor引数として注入したい。
疑問
直近で一番困っているのは、IDbConnectionは誰が作って誰が所有し、どう受け渡すのかという点です。
IDbConnectionまたはファクトリメソッド(Func<IDbConnection>)をサービスにConstructor Injectionして、サービスが自身で利用するDAOにsetプロパティで注入する感じでしょうか。そしてサービスのDisposeでIDbConnectionを一緒にDisposeしてあげる感じでしょうか?
ファクトリじゃなくてIDbConnectionの実インスタンスを直接Constructor Injectionするのであれば、誰が接続を担当するのでしょうか?そもそも接続毎にサービスオブジェクトも新しく作るのでしょうか?
当初、サービスやDAOのインターフェースまではRDBMSを意識しないのかな、と思っていたのですが、複数テーブルにまたがるトランザクションの実現でハマってしまいました。こんなスレッドを読んだりして、サービスはRDBMSを意識してもいいのか?DAOが永続化の抽象化レイヤなのだからRDBMSを意識するのはDAOの実実装だけではないのか?と混乱しています。
その他
そもそもEntiryFrameworkも別のフレームワークもなしでベタ実装するのが無謀であるとか、この書籍/webサイトだともっと全体的に勉強できるよとか、ちゃんとデザインパターンがあるよとか、そういう話がありましたら、そちらもご教授頂ければ大変有難く思います。
回答2件
あなたの回答
tips
プレビュー