.net core2.x - 關於倉儲(Repository)


概要:在搭建框架,順手說下寫下,關於Repository,可能你理解了,可能你還不理解,可能與不可能不是重點,重點是感興趣就看看吧。

  1.倉儲(Repository)是什么?

  看下翻譯:倉庫; 貯藏室; 博物館; 親信;(百度翻譯),說他是親信?怎么理解?我們在初始化上下文之后,訪問數據庫的操作就是由他操作的,提供數據庫的增刪改查操作,它的存在 起到了 承上啟下的作用 ,承上:隔離了業務直接訪問上下文對象; 啟下:

業務操作,用它提供CRUD操作。

  所以簡要概括就是這幾點:

  a) 隔離上下文,提供統一的操作方法(CRUD)

  b)為業務開發(程序開發)提供統一的規范

  2.相關示例

  見示例代碼:

public class Repository<TEntity, TKey> : IRepository<TEntity, TKey>
        where TEntity : class, IEntity<TKey>
    {
        #region ctor
        public Repository(IUnitOfWork unitOfWork)
        {
            _dbContext = unitOfWork.GetDbContext as DbContext;
            _dbSet = _dbContext.Set<TEntity>();
        }
        #endregion

        #region fields
        private readonly DbSet<TEntity> _dbSet;
        private readonly DbContext _dbContext;
        #endregion

        #region query
        public TEntity GetByKey(TKey key)
        {
            return _dbSet.Find(key);
        }

        public async Task<TEntity> GetByKeyAsync(TKey key)
        {
            return await _dbSet.FindAsync(key);
        }

        public IQueryable<TEntity> Query(Expression<Func<TEntity, bool>> expression)
        {
            return _dbSet.Where(expression);
        }

        #endregion

        #region insert
        public void Insert(TEntity entity)
        {
            _dbSet.Add(entity);
        }

        public void Insert(IEnumerable<TEntity> entities)
        {
            _dbSet.AddRange(entities);
        }

        public async Task InsertAsync(TEntity entity)
        {
            await _dbSet.AddAsync(entity);
        }

        public async Task InsertAsync(IEnumerable<TEntity> entities)
        {
            await _dbSet.AddRangeAsync(entities);
        }

        #endregion

        #region update
        public void Remove(TEntity entity)
        {
            _dbSet.Remove(entity);
        }

        public void Remove(Expression<Func<TEntity, bool>> expression)
        {
            var entities = _dbSet.AsNoTracking().Where(expression).ToList();
            _dbSet.RemoveRange(entities);
        }

        #endregion

        #region remove
        public void Update(TEntity entity)
        {
            _dbSet.Update(entity);
        }

        public void Update(IEnumerable<TEntity> entities)
        {
            _dbSet.UpdateRange(entities);
        }

        #endregion
    }
View Code

  以上為一個示例代碼,如果有其他需求自行修改,比如:根據某個屬性進行編輯操作等。這里涉及到一個 uow對象的注入,它提供了上下文對象(見上一篇的 uow模式)

  這樣以來,在service層如果我們想要操作數據庫的 增刪改查 操作,只需要將 repository注入即可,上面的代碼對應的接口實現如下:

public interface IRepository<TEntity, TKey>
        where TEntity : class, IEntity<TKey>
    {
        #region Query
        TEntity GetByKey(TKey key);
        Task<TEntity> GetByKeyAsync(TKey key);
        IQueryable<TEntity> Query(Expression<Func<TEntity, bool>> expression);

        #endregion

        #region Insert
        void Insert(TEntity entity);
        void Insert(IEnumerable<TEntity> entities);
        Task InsertAsync(TEntity entity);
        Task InsertAsync(IEnumerable<TEntity> entities);
        #endregion

        #region Update
        void Update(TEntity entity);
        void Update(IEnumerable<TEntity> entities);

        #endregion

        #region Remove
        void Remove(TEntity entity);
        void Remove(Expression<Func<TEntity, bool>> expression);
        
        #endregion

    }
View Code

  其中你可能會有一個疑問 uow和repository有啥關系? 可以見我之前有寫的 一個說明 二者關系

  

完!

  

   

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM