7

私は、DDD in .NET に関する Tim McCarthy のすばらしい本を読んでいます。ただし、彼のサンプル アプリケーションでは、基礎となるデータ アクセスに SqlCE を使用しており、SQL インラインを手作業で作成しています。

Entity Framework を活用するためのいくつかのパターンを試してきましたが、IRepository linq クエリを基になるデータ アクセス レイヤーに正確にマップする方法に行き詰まりました。

と呼ばれる具体的なリポジトリ実装があります。

public EFCustomerRepository : IRepository<DomainEntities.Customer> 
{
    IEnumerable<DomainEntities.Customer> GetAll(
                     Expression<Func<DomainEntities.Customer, bool>> predicate)
    {
        //Code to access the EF Datacontext goes here...
    }
}

私の EF モデルでは、POCO エンティティを使用していますが、それでも、DomainEntity.Customer と DataAccessLayer.Customer オブジェクトの間にネイティブ マッピングはありません。

そのため、単にExpression<Func<DomainEntities.Customer, bool>> predicateパラメータとして渡すことはできませんEFContext.Customers.Where(...);

Expression<Func<T, bool>> predicate=>をマップする簡単な方法はありますか Expression<Func<TOTHER, bool>> predicate

それとも、私はこれについてすべて間違っていますか?任意の提案/ポインタをいただければ幸いです。

4

2 に答える 2

3

このような場合、ある式ツリーから別の式ツリー (おそらく複数) への独自のカスタム コンバーターを実装する必要があります。これには、マッピング ロジックが完全に含まれます。通常、式は現時点では単なる仕様 (仕様パターン) であり、その仕様を変換して式を格納する必要があります。

ところで。違います。個別のデータ アクセス レイヤー オブジェクトがあってはなりません。データ アクセス レイヤーはドメイン オブジェクトを直接読み込んで保存する必要がありますが、マッピング機能が制限されており、独自の要件をエンティティにプッシュするため、EF はそれを正しく行うことができません。DDDを本気で(本で)やりたいなら、NHibernateや他のORMをチェックすべきです。

于 2011-08-10T13:48:14.787 に答える
2

あなたの例で提供されているコードから、一般的なリポジトリ パターンを使用していないと思いますか?

私はEF CodeFirst を使用します (ただし、古い EF では機能します)。

その投稿にはありませんがExpression<Func<DomainEntities.Customer, bool>> 、インターフェイスには常に Find メソッドがありIRepository<T>ます。

インターフェース:

IEnumerable<T> Find(Expression<Func<T, bool>> expression, int maxHits = 100);

そして、抽象 baserepository での実装:

public virtual IEnumerable<T> Find(Expression<Func<T, bool>> expression, int maxHits = 100) {
    return this.DataContext.DbSet<T>().Where(expression).Take(maxHits);
}

そして今、ラムダ式によって任意のエンティティで Find を呼び出すことができます...

正しく理解できない場合は、完全な例を投稿できます。

于 2011-08-14T19:30:36.253 に答える