2013-03-15 57 views
0

而不是一个接口,我希望我的存储库从一个抽象类(Base Repository)继承。我决定我想使用抽象类,因为我不会单元测试存储库(我将单元测试服务层),而且我不想将相同的实现复制到从此基本存储库继承的每个存储库类。C#与实体框架有没有一种方法来实现存储库模式与抽象基类?

例如:

public abstract class BaseRepository<T> where T : class 
{ 
    protected DbSet<T> dbSet; 

    public BaseRepository(DbContext dataContext) 
    { 
     dbSet = dataContext.Set<T>(); 
    } 

    public void Insert(T entity) 
    { 
     dbSet.Add(entity); 
    } 

    public IEnumerable<T> SearchFor(Expression<Func<T, bool>> predicate) 
    { 
     return dbSet.Where(predicate); 
    } 

    public IEnumerable<T> GetAll() 
    { 
     return dbSet; 
    } 

    public T GetById(int id) 
    { 
     return dbSet.Find(id); 
    } 
} 

当我试图建立从这个基础库继承其他存储库,我得到的构造问题。如何将datacontext传递到这些派生类,以便可以使用它们?

回答

3

您需要通过上下文中的构造器:

public class Repository<TEntity> where TEntity : class 
    { 
     internal MyEntities context; 
     internal DbSet<TEntity> dbSet; 

     public Repository(MyEntities context) 
     { 
      this.context = context; 
      this.dbSet = context.Set<TEntity>(); 
     } 

     public virtual IEnumerable<TEntity> Get(
      Expression<Func<TEntity, bool>> filter = null, 
      Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null, 
      string includeProperties = "") 
     { 
      IQueryable<TEntity> query = dbSet; 

      if (filter != null) 
      { 
       query = query.Where(filter); 
      } 

      foreach (var includeProperty in includeProperties.Split 
       (new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) 
      { 
       query = query.Include(includeProperty); 
      } 

      if (orderBy != null) 
      { 
       return orderBy(query).ToList(); 
      } 
      else 
      { 
       return query.ToList(); 
      } 
     } 

     public virtual TEntity GetByID(object id) 
     { 
      return dbSet.Find(id); 
     } 

     public virtual void Insert(TEntity entity) 
     { 
      dbSet.Add(entity); 
     } 

     public virtual void Delete(object id) 
     { 
      TEntity entityToDelete = dbSet.Find(id); 
      Delete(entityToDelete); 
     } 

     public virtual void Delete(TEntity entityToDelete) 
     { 
      if (context.Entry(entityToDelete).State == EntityState.Detached) 
      { 
       dbSet.Attach(entityToDelete); 
      } 
      dbSet.Remove(entityToDelete); 
     } 

     public virtual void Update(TEntity entityToUpdate) 
     { 
      dbSet.Attach(entityToUpdate); 
      context.Entry(entityToUpdate).State = EntityState.Modified; 
     } 
    } 

用途:

var repo = new Repository<MyClass>(context); 
+0

你的榜样是行不通的,因为我的基类是抽象的。在C#中,抽象类不能实例化。 – RiceRiceBaby 2013-03-15 19:45:02

+0

不要使它成为抽象基类。在你的UnitOfWork类中创建你的repo,并用这个Repo类实例化它们。 – 2013-03-15 21:42:03

+0

我想创建一个抽象基类,这样我就不必为所有存储库类添加相同的实现。我没有看到创建接口的要点,因为我只会用假服务类来对控制器进行单元测试。 – RiceRiceBaby 2013-03-19 15:56:17

相关问题