2013-03-15 107 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

相關問題