3

私は最初にEntityFrameworkとCodeを使用しています。これが私の場合を示す簡単な例です。

public class PersonEfModel
{
    public int Id { get; set; }
    public string Vorname { get; set; }
    public string Nachname { get; set; }
}

public class EfContext : DbContext
{
    public DbSet<Person> Personen { get; set; }
}

データアクセスの実装から独立するために、リポジトリを使用して抽象化レイヤーを作成しました。

public class Person
{
    public int Id { get; set; }
    public string Vorname { get; set; }
    public string Nachname { get; set; }
}

public interface IGenericRepository<T>
{
    int Count { get; }

    void Add(T item);
    void Delete(T item);
    void Update(T item);

    T GetData(int id);
    IEnumerable<T> GetData();
    IEnumerable<T> GetData(int offset, int count);

    IEnumerable<T> Find(Expression<Func<T,bool>> predicate);
    IEnumerable<T> Find(IEnumerable<Expression<Func<T, bool>>> predicates);
}

PersonPersonEfModelデータベースモデルから完全に独立するには、2つの異なるタイプである必要があります。したがって、Personタイプの汎用リポジトリがありますが、Findメソッドを実装する方法がわかりません。Personに依存せず、PersonEfModelに依存するデータベースに対してのみ式を実行できます。

それで、データベースに対してそれを実行するためにをに変換する方法はありExpression<Func<Person, bool>>ますExpression<Func<PersonEfModel, bool>>か、それとも私は間違ったパスにいますか?

4

1 に答える 1

1

本当にドメイン駆動設計に従っている場合は、を表すために2つの別個のオブジェクトを作成する必要はありませんPerson。あなたのPersonクラスはすでにPOCOであり、あなた自身のコードで必要な正確なエンティティを表しています(結局、Code Firstを使用しています)。

あなたは、余分で完全に不必要な複雑さを導入しているだけです。クラスを変更するたびに、Personクラスを変更する必要がありPersonEfModelます。リポジトリを機能させるには、ある種のマッパー(AutoMapper)を使用する必要がありますPersonPersonEfModelこれは、2つが同じである可能性が高いため、完全に不要です。

于 2013-03-25T14:13:32.310 に答える