私はちょうど DDD を学んでいて (Eric Evans の本が目の前で開かれています)、答えが見つからない問題に遭遇しました。検索レコードの単純なリストを取得しようとしているだけの場合、DDD で何をしますか?
元。
EmployeeID: 123
EmployeeName: John Doe
州: Alaska (ドロップダウン)
County: Wasilla (ドロップダウン -- 州に基づいてフィルタリングされます)。
たとえば、Employee ドメイン オブジェクト、IEmployeeRepository インターフェイス、EmployeeRepository クラスがあるとします。これは、従業員のリストと個人の詳細を表示するために UI によって使用されます。UI で、従業員が住んでいる州と郡のドロップダウンを使用したいと考えています。利用可能な郡は、選択された州に基づいてフィルタリングされます。
残念ながら、データベース テーブルと UI は大きく異なります。tblEmployees には、州名と郡名ではなく、州コード=AK と郡コード=02130 が含まれています。
古い方法 (この DDD クエストを開始する前) は非常に簡単で、2 つのクエリを作成し、DataReader を使用してドロップダウンに入力するだけです。ドロップダウンの表示の下に値があり、フォームの投稿で自動的に使用されます。
ただし、DDD では、これをどのように行うべきかわかりません。まず、State オブジェクトと County オブジェクト、およびリポジトリとリポジトリ用のインターフェイスを作成することから始めました。ただし、4 つのクラス + 2 つのインターフェイスと hbm.xml ファイル内の配管 + Employee Business オブジェクトを記述することは、2 つのドロップダウンに対して 2 つのクエリだけを行うにはやり過ぎのように思えます。もっと良い方法があるはずですよね?State または County のテーブルのレコードを当面変更する予定はありません。変更したとしても、このアプリケーションによるものではありません。そのため、必要がなければ、州と郡のビジネス オブジェクトを作成したくありません。
私が考える最も簡単な解決策は、GetStatesAll()、GetState()、GetCounties()、GetCounty() などの辞書を返すメソッドを使用してヘルパー クラスを作成することですが、DDD の観点からすると、それは間違っているように感じられます。
助けてください。いくつかの単純なルックアップだけをオーバーエンジニアリングせずに DDD を使用するにはどうすればよいですか?
最終的な解決策 リポジトリ クラスではなく、独自のデータ アクセス クラスに GetStates() メソッドを配置するという経験を通じて、最終的に答えを見つけたと思います。私は読み取り専用アクセスしか行っていなかったので、構造体 DTO に入れました。データベースが小さかったので、Todd が後述するように、それらを 1 つのクラスにまとめました。
私の結論:
- ルックアップ テーブルには常に ID があるため、ルックアップ テーブルは決して値オブジェクトではありません。ID がない場合は重複が発生し、あまり意味がありません。
- 読み取り専用のルックアップ テーブルはリポジトリを持つことができますが、おそらく必要ありません。リポジトリの目標は、集約を介してのみアクセスを強制することにより、複雑さを軽減することです。集計を行うことで、車を持っていない場合はタイヤを追加しないなど、ビジネス ルールを適用できるようにする方法が提供されます。
- ルックアップ テーブルで CRUD メンテナンスを許可する場合は、ルックアップ テーブルが独自のリポジトリを持つことが理にかなっています。
- コードを構造体として保存することになったという事実は、それらを「値型」にしません。Fowler は POEAA で、構造体は値型であると述べています。確かに、構造体は不変です。そのため、ファウラーは「値型」であると言っていますが、私はそれらを別の方法で使用していました。最初の作成後に変更する予定がなかった DTO を渡すための軽量な方法として、構造体を使用していました。実際、私が使用した構造体には確かに ID がありましたが、それらは読み取り専用であるため、構造体として機能していました。
- 他ではあまり見かけない、私が使ってきた 1 つのパターンは、主キー フィールドを不変にすることです。それらはコンストラクターによって設定されますが、読み取り専用 (プライベート アクセサーではない) であり、オブジェクトが作成されると変更できません。