1. 程式人生 > >.net core2.x - 關於倉儲(Repository)

.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有啥關係? 可以見我之前有寫的 一個說明 二者關係

  

完!