質問

レガシデータベースの上にアプリケーションを構築しています(変更できません)。データアクセスにLinq to SQLを使用しています。つまり、各テーブルに(Linq to SQL)クラスがあります。

私のドメインモデルはデータベースと一致しません。たとえば、 Users Employees という2つのテーブルがあるため、 User Employee <という2つのLinq to SQLクラスがあります。 / code>。しかし、私のドメインモデルでは、いずれかのテーブルのフィールドを含む User クラスが必要です(ただし、これらのテーブルの他のフィールドの多くは気にしません)。

リポジトリの設計方法がわからない:

  • リポジトリは、Linq to SQLクラス( User Employee )からドメインクラス( User )へのマッピングのみを実行する必要があります。ドメインクラスをアプリケーションに返します
  • または私のリポジトリがLinqをSQLクラスに返し、マッピングを呼び出し元に残す必要があります

最初のアプローチは私にとってより理にかなっているようですが、これは私のリポジトリを実装する正しい方法ですか?

役に立ちましたか?

解決

純粋主義者(私は純粋にしようとする)は、あなたのモデルがあなたのデータを表していることを教えてくれるでしょう。したがって、永続化する必要があるものはすべて、リポジトリを介して必要な場合にのみ行われます。また、複雑なエンティティがある場合は、サービスを使用してそれらを結合します。たとえば、User + Employee = IUserEmployeeServiceを介してのみアクセス可能なUserEmployeeエンティティです。

これらのあいまいなステートメントを使用すると、ここで素晴らしい機会を得ることができます。

腐敗防止レイヤーを構築します。これにより、レガシーDBからの移動を同時に開始できます。

これは、DDDプレイブックの別の章です。腐敗防止レイヤーは、Facades、Translator、およびAdaptersを使用してレガシーシステムとインターフェイスし、純粋なドメインモデルでレガシーDBを分離するために使用されます。

今、これはあなたが望んでいたよりもはるかに多くの仕事かもしれません。したがって、この時点で自問する必要があります。

  

のプロセスを開始しますか   このレガシーDBから移動する、または   それは一生続く   アプリケーション?

答えが移行を開始できる場合、実際のドメインを希望どおりにモデリングします。通常のリポジトリとサービスで永続化します。保存したい方法でデザインを楽しんでください。次に、集約ルートのサービスを使用して、腐敗防止レイヤーに到達し、エンティティを引き出し、ローカルに保存/更新し、ドメインのエンティティに変換します。

答えが、プロジェクトの存続期間中にレガシーDBが残るということであれば、タスクははるかに簡単です。ドメインのサービス(UserEmployeeServiceなど)を使用して、腐敗防止のUserFacadeおよびEmployeeFacadeにアクセスします(「リモートサービス」の概念に似ています)。

ファサード内で、アダプター(LegacyDbSqlDatabaseなど)を使用してレガシーデータベースにアクセスし、生のlegacyUser()を取得します。次のステップは、レガシーユーザーデータを実際のドメインのバージョンのUser()エンティティに変換するUserTranslator()およびEmployeeTranslator()マッパーを使用し、それをUserFacadeからUserEmployeeServiceに返します。同じ場所から来た従業員エンティティ。

うーん、タイピングが多かった...

Anti-Corruptionレイヤーのアダプターとファサードを使用して、Linq-to-Sqlまたは任意の操作を実行できます。レガシーのDB /システムを、純粋で純粋なドメイン(User()およびEmployee()エンティティの独自バージョンと値オブジェクトを持つドメイン)から完全に分離しているため、問題ではありません。

他のヒント

DDDとLinq To SQLは、生成されたクラスがDBテーブル構造から大きく逸脱することを意図していないため、あまりうまくいきません。 Linq to SQLでの作業が苦痛になるような方法でクラスをマッピングするか、理想的でないオブジェクトモデルをそのまま使用する必要があります。

DDDとリポジトリパターンを実際に使用する場合は、Entity Frameworkまたはさらに優れたNHibernateを選択してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top