4

アプリケーションがいくつかのアセンブリに分割されています。

MyProject.Core アセンブリには、Person や Sale などのすべての Domain オブジェクトと、IPersonRepository や ISaleRepository などのインターフェイス リポジトリが含まれています。

MyProject.Data は永続性を処理することになっていますが、これがどのように機能するかについて少し混乱しています。テーブルをドメイン モデルにマップするために Entity Framework を使用する必要がありますか? Fluent API でこれを行う必要がありますか? それとも、モデル クラスをインスタンス化して手動で入力することになっているのでしょうか?

4

3 に答える 3

3

IMO では、ドメイン モデル オブジェクトをエンティティ フレームワーク エンティティとして使用しないでください。アトミック メソッドで構成される適切にカプセル化されたドメイン オブジェクトを作成することはできません。代わりに、EF が必要とする getter と setter を持つパブリック プロパティが必要になり、これがAnemic Domain Modelにつながります。

基本的に、ドメイン オブジェクトをエンティティ フレームワーク エンティティとして倍増させようとすると、設計が損なわれます。

代わりに、 memento patternに大まかに似たものを使用します。これにより、「mementos」として機能する EF エンティティでドメイン オブジェクトを再水和します。Vaugh Vernon は、これらのオブジェクトを「状態オブジェクト」と呼んでいます。

EF が単純な POCO を使用できることを考えると、モデルがそれらを参照する必要があるため、これらのクラスを DbContext/Respositories をホストするアセンブリとは別のアセンブリに配置します。それらは単なる POCO であるため、モデルを EF に結び付けることはありません。

したがって、次の 3 つのアセンブリが存在する可能性があります。

  • MyProject.Model / MyProject.Core / MyProject.Domain ... DDD モデル クラスとリポジトリ インターフェイスを含む
  • MyProject.Infrastructure ... DBContext、リポジトリ実装、および状態オブジェクトを含む

例:

public class PersonRepository  : EntityFrameworkRepository, IPersonRepository
{
      public Person GetById(Guid personId)
      {
           using (MyDbContext ctx = new MyDbContext())
           { 
               var personState = (from p in ctx.People
                                   where p.PersonId == personId
                                   select p).FirstOrDefault(); 


               return Person.RestoreFromState(personState );

           }
      }
}

アップデート

EF Core を使用すると、プライベート フィールドにマップできるようになったため、設計の整合性を維持するためにこのレベルの複雑さを追加する必要がない場合があります。

また、この件に関するVaughn Vernon の次の投稿をお勧めします。

于 2013-06-10T10:39:12.613 に答える
1

MyProject.Data は永続性を処理することになっていますが、これがどのように機能するかについて少し混乱しています。テーブルをドメイン モデルにマップするために Entity Framework を使用する必要がありますか? Fluent API でこれを行う必要がありますか? それとも、モデル クラスをインスタンス化して手動で入力することになっているのでしょうか?

知っていること、または許可されている場合は、学びたいことを使用してください。

いずれにせよ、DB 固有の情報をドメイン モデルに漏らしたり、モデルに DB の制限を加えたりしてはなりません。

于 2013-06-14T13:12:37.833 に答える
0

業界標準の方法は、Entity Framework や NHibernate などのオブジェクト/リレーション マッパーを使用して、エンティティを読み込んで永続化することです。

O/RM は、オブジェクト指向言語と関係データベースの間のインピーダンスの不一致を橋渡しするためのツールです。

多くの場合、リポジトリ パターンと組み合わされます。

これらのツールを使用することは必須ではありません。手動でエンティティをデータベースに保存したり、独自の O/RM を構築したりすることもできますが、多くの不必要な頭痛の種になります。O/RM ツールを使用することで、DDD アプリケーションの構築における他の多くの経験から利益を得ることができます。

また、O/RM は DDD アプリケーションだけのものではないことも指摘しておく価値があります。

私のアプリケーションでは、データ層は通常、いくつかのリポジトリ、NHibernate マッピング ファイル、およびその他の NHibernate 実装コードです。

于 2013-06-14T13:56:36.807 に答える