11

プラットフォームの制限により、ado.net を使用してリポジトリ パターンを実装しようとしています。

public interface IGenericRepository<T> : IDisposable where T : class
{
    IQueryable<T> GetAll();
    IQueryable<T> FindBy(Expression<Func<T, bool>> predicate);
    void Add(T entity);
    void Delete(T entity);
    void Edit(T entity);
    void Save();
}

次の抽象クラスを完成させる方法は...?

public abstract class GenericRepository<C, T> :
    IGenericRepository<T>
    where T : class
    where C : IDbDataAdapter, new()
{

    private C dbDataAdapter = new C();
    protected C DB
    {
        get { return dbDataAdapter; }
        set { dbDataAdapter = value; }
    }

    public virtual IQueryable<T> GetAll()
    {
        DataTable dt;
        dbDataAdapter.fill(dt);
        IQueryable<T> query = dt....?;
        return query;
    }

    public IQueryable<T> FindBy(System.Linq.Expressions.Expression<Func<T, bool>> predicate)
    {

        IQueryable<T> query = dbDataAdapter.???Set<T>???().Where(predicate);
        return query;
    }

更新:
これら 2 つの固有のインターフェイス/クラスによって、後でドメイン指定リポジトリを実装します。

public class FooRepository :
    GenericRepository<FooBarEntities, Foo>, IFooRepository {

    public Foo GetSingle(int fooId) {

        var query = GetAll().FirstOrDefault(x => x.FooId == fooId);
        return query;
    }
}
4

4 に答える 4

6

通常、汎用リポジトリを使用することはお勧めできません。リポジトリは重要なドメインの概念であり、エンティティを一般化したくないのと同じように、過度に一般化したくありません。汎用リポジトリは CRUDy であり、ドメインから焦点を移します。Greg Young によるこの記事を検討してください。

関連する注意事項として、IQueryable を公開すると、コードのドメインが少なくなり、データ駆動型になるだけでなく、密結合が導入されます。

于 2012-05-23T21:25:02.760 に答える
0

典型的なORマッパーが行うことの一部を構築しようとしています。これは大変な作業です。なぜORMを使用しないのですか?

于 2012-05-23T21:21:24.577 に答える