概要:在搭建框架,顺手说下写下,关于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
}

  以上为一个示例代码,如果有其他需求自行修改,比如:根据某个属性进行编辑操作等。这里涉及到一个 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 }

  其中你可能会有一个疑问 uow和repository有啥关系? 可以见我之前有写的 一个说明 二者关系

  

完!

  

  

  

最新文章

  1. Win7系统安装好Axure点击运行报.NET Framework4.0未安装的解决办法
  2. SpringAOP详解(转载大神的)
  3. SVG的使用
  4. 全部springxml文件约束 applicationContext.xml
  5. block大小和分区最大容量单个文件最大容量的关系
  6. jmeter 异步子请求测试随笔
  7. Java中Volatile关键字详解
  8. Django - 通用视图
  9. vue 基础--&gt;进阶 教程(3):组件嵌套、组件之间的通信、路由机制
  10. Redis实现分布式锁的正确姿势
  11. 【程序员札记#学习&amp;&amp;塑形# 】2018年5月04号
  12. [Swift]LeetCode397. 整数替换 | Integer Replacement
  13. js $的扩展写法
  14. Nginx搭建
  15. 深入理解 BFC
  16. SQL*Plus连接符拼接输出
  17. GIS原理学习目录
  18. veloctiy入门
  19. 从零搭建SSM框架(三)SSM框架整合
  20. 每天一个linux命令(权限):【转载】chown命令

热门文章

  1. Vivado寄存器初始值问题
  2. 守护进程(Daemon)
  3. 【并发编程】【JDK源码】JDK的(J.U.C)java.util.concurrent包结构
  4. 第五篇-ubuntu下插入U盘,显示可读系统。
  5. JS学习笔记Day8
  6. &lt;五&gt;企业级开源仓库nexus3实战应用–使用nexus3配置npm私有仓库
  7. Docker:macvlan实现容器跨主机通信 [十四]
  8. GIT-常规操作
  9. DirectX11 With Windows SDK--22 立方体映射:静态天空盒的读取与实现
  10. IIS版本号可以被识别 解决方案