現在、DDDアプローチを使用してアプリケーションの構築を開始しているプロジェクトに取り組んでいます。データの永続化を支援するために、現在Entity Framework 6コードの使用を検討しています。私の質問は、ドメインオブジェクトとEFエンティティ間のデータマッピングを最適に処理する方法ですか?
長期的にアプリと自分を健全に保つために、永続性に関連する問題(どのデータベース、どの組織など)でDDDアプリを起動しないでください。常に開発の最終段階としてデータベースに触れてください。
ドメインと、実際には永続性を除く他のモデルをモデル化します。リポジトリパターンを使用して、アプリを永続性から切り離します。アプリケーションの必要に応じてレポジトリインターフェイスを定義し、dbアクセスメソッドに結び付けません(だから、後で永続性を実装するので、アプリを永続性の詳細に結び付けたくはないでしょう)。
リポジトリインターフェイスのメモリ内実装を記述します。これは通常、リストまたはディクショナリの単純なラッパーを意味するため、非常に高速に記述でき、より重要なのは変更が簡単です。これらを使用して、実際にアプリをテストおよび開発します。
インターフェイスが安定し、アプリが動作したら、必要なものを使用できる永続化実装を作成します。 EFの場合、マッピングが行われます。
今、これは非常に主観的であり、正しい方法も間違った方法もありません。あなたが物事を行うことを好む方法があります。
個人的には、メメントを使用する習慣があるため、ドメインオブジェクトからメメントを取得し、それを(micro)ORMエンティティに手動でマッピングします。手動で行うのは、記憶に値オブジェクトが含まれているためです。 AutoMapperを使用する場合、それを構成する必要があり、本質的には手動で行うよりも多くのコードを書くことになります
更新(2015)
最近では、オブジェクトをJsonし、特定の読み取りモデルを使用するか、シリアル化されたオブジェクトを含むData
列を持つ読み取りモデルに直接格納します。 Mementosは、非常に特殊な場合にのみ使用します。 </更新>
ドメインオブジェクトの外観とEFエンティティの外観に応じて、マッピングの大部分でオートマッパーを使用して逃げることができます。ただし、リポジトリをテストするのに苦労します。
それはあなた次第です方法あなたのスタイルに合った方法を見つけて、簡単に維持できますが、ドメインオブジェクトをより互換性のあるものにしたり、ORMエンティティに一致するように設計したり変更したりしないでください。データベースやORMを変更することではなく、ドメイン(およびアプリの残りの部分)を永続性の詳細(ORMである)から適切に切り離すことです。
したがって、他の層の実装の詳細であるものを再利用する誘惑に抵抗してください。アプリケーションがレイヤーで構造化されている理由は、デカップリングが必要なためです。そのままにしている。
Entity Framework 6コードを最初に使用することを検討しているため、単にEFオブジェクトをドメインオブジェクトとして使用しないのはなぜですか?したがって、最初にドメインモデルを設計し、次にデータベース構造を設計します。
私はNHibernateを使用してきましたが、EFでは、特にEF6を使用して、DBテーブルからPOCOオブジェクトへのマッピングルールも指定できると考えています。 EFエンティティ上に別の抽象化レイヤーを開発するのは特別な努力です。 ORMに責任を負わせてください。
「AutoMapperとリポジトリパターンを使用したEntity Framework 5」 およびを読むことができるというこの記事には同意しません。ドメインオブジェクト:
AutoMapper は、プレゼンテーションレイヤーの構築を開始し、多くのUI固有のビューモデルに直面するときに確実に役立ちます。 貧弱なモデル を構築するのに役立ち、パブリックセッターがないときに実際のDomainオブジェクトでは少し役に立たない。
Jimmy Bogardによる古い投稿があります "AutoMapperでの双方向マッピングのケース" 彼が"There is no two-way mapping because we never need two-way mapping."
AutoMapperは何のために使用していますか?私たちの5つのプロファイルは次のとおりです。
- ドメインからViewModel(MVC用の厳密に型指定されたビューモデル)へ
- ドメインからEditModelへ(MVCのフォーム用の厳密に型指定されたビューモデル)
- EditModelからCommandMessagesへ–緩やかに型付けされたEditModelから、強く型付けされたブレークアウトメッセージへ。単一のEditModelで、半ダースのメッセージが生成される場合があります。
- ドメインからReportModelへ–強く型付けされたTelerikレポート
- ドメインからEDIモデル– EDIレポートの生成に使用される平坦化されたモデル
ああ、私はその余分なレイヤーをまったく追加しません。
NHibernateおよびEntity Framework Code-First(私はEFを使用します)は、この正確な問題を解決するように設計されています-ドメインオブジェクトをリレーショナルモデルにマッピングします(設計に同じ制約がないため、可能性があり、おそらく、別の形にする)。
EFの優れたマッピング機能を無駄にして、AutoMapperでさえ別のものに置き換えるのは残念なことです。