DDD を使用する場合にリポジトリを使用する利点は、オブジェクトがどのように永続化されるかを気にせずにドメイン モデルを設計できることです。また、リポジトリのさまざまな実装を簡単にスワップインおよびスワップアウトできるため、最終製品をより柔軟にすることもできます。そのため、リポジトリの実装は、SQL データベース、REST Web サービス、XML ファイル、またはデータを保存および取得するその他の方法に基づくことができます。モデルの観点からは、集計ルート オブジェクトの格納と取得に使用できるこれらの魔法のコレクションだけが存在することが期待されます。
2 つの通常のメモリ内コレクション、たとえば anIList<Order>
と anがあるIList<Customer>
場合、一方のコレクションを変更すると他方のコレクションが影響を受けるとは思いません。では、同じロジックをリポジトリに適用する必要がありますか? リポジトリの実際の実装は、実際には同じデータベースにアクセスする場合でも、互いに完全に分離する必要がありますか?
たとえば、顧客が削除されたときに対応する注文が削除されるように、Customers
テーブルとテーブルの間にカスケード オン デリートの関係を SQL データベースで設定することができます。Orders
ただし、後でSQLCustomerRepository
が に置き換えられると、この機能は壊れRESTCustomerRepository
ます。
リポジトリが互いに完全に分離されており、それに応じてリポジトリの実際の実装も分離されている必要があるという仮定の下にモデルを常に配置する必要があると考えるのは正しいですか?
では、データベースに依存するのではなく、ドメイン モデルでこれを明示的に定義する必要がありますかOrders
? 現在のとにアクセスCustomer
するメソッドを使用して言います。CustomerService.DeleteCustomer()
ICustomerRepository
IOrderRepository
リレーショナルの世界から抜け出して DDD の世界に足を踏み入れるのに苦労しているだけだと思います。私は、テーブルと PK/FK の関係の観点から物事を考えたいと思っていますが、データベースが関係していることはまったく無視する必要があります。