0

インターフェイスの代わりに、リポジトリを抽象クラス(ベースリポジトリ)から継承したいと思います。リポジトリの単体テストは行わず(代わりにサービスレイヤーの単体テストを行います)、このベースリポジトリから継承するすべてのリポジトリクラスに同じ実装をコピーしたくないため、抽象クラスを使用することにしました。 。

例えば:

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);
    }
}

このベースリポジトリから継承する他のリポジトリを作成しようとすると、コンストラクタで問題が発生します。これらの派生クラスにデータコンテキストを渡して、それらを使用できるようにするにはどうすればよいですか?

4

1 に答える 1

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);
于 2013-03-15T18:43:43.507 に答える