.net core2.x - 關於倉儲(Repository)
阿新 • • 發佈:2018-11-06
概要:在搭建框架,順手說下寫下,關於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 asView CodeDbContext; _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 }
以上為一個示例程式碼,如果有其他需求自行修改,比如:根據某個屬性進行編輯操作等。這裡涉及到一個 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有啥關係? 可以見我之前有寫的 一個說明 二者關係
完!