使用旧的ado.net实现通用存储库模式

ca9*_*3d9 9 c# orm design-patterns domain-driven-design repository-pattern

我试图使用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();
}
Run Code Online (Sandbox Code Playgroud)

如何完成以下抽象类......?

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;
    }
Run Code Online (Sandbox Code Playgroud)

更新:
我将通过固有的这两个接口/类来实现域指定的存储库.

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

    public Foo GetSingle(int fooId) {

        var query = GetAll().FirstOrDefault(x => x.FooId == fooId);
        return query;
    }
}
Run Code Online (Sandbox Code Playgroud)

Dmi*_*try 6

拥有通用存储库通常不是一个好主意.存储库是一个重要的域概念,您不希望过度概括它,就像您不想概括您的实体一样.通用存储库是CRUDy,将焦点从您的域转移.请考虑Greg Young的这篇文章.

在相关的说明中,除了使代码更少和更多数据驱动之外,公开IQueryable还会引入紧耦合.


usr*_*usr 0

您正在尝试构建典型 OR 映射器的一部分功能。这是一项繁重的工作。为什么不直接使用 ORM?