.net core2.x - 关于仓储(Repository)
2024-09-30 04:26:59
概要:在搭建框架,顺手说下写下,关于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有啥关系? 可以见我之前有写的 一个说明 二者关系
完!
最新文章
- Win7系统安装好Axure点击运行报.NET Framework4.0未安装的解决办法
- SpringAOP详解(转载大神的)
- SVG的使用
- 全部springxml文件约束 applicationContext.xml
- block大小和分区最大容量单个文件最大容量的关系
- jmeter 异步子请求测试随笔
- Java中Volatile关键字详解
- Django - 通用视图
- vue 基础-->;进阶 教程(3):组件嵌套、组件之间的通信、路由机制
- Redis实现分布式锁的正确姿势
- 【程序员札记#学习&;&;塑形# 】2018年5月04号
- [Swift]LeetCode397. 整数替换 | Integer Replacement
- js $的扩展写法
- Nginx搭建
- 深入理解 BFC
- SQL*Plus连接符拼接输出
- GIS原理学习目录
- veloctiy入门
- 从零搭建SSM框架(三)SSM框架整合
- 每天一个linux命令(权限):【转载】chown命令
热门文章
- Vivado寄存器初始值问题
- 守护进程(Daemon)
- 【并发编程】【JDK源码】JDK的(J.U.C)java.util.concurrent包结构
- 第五篇-ubuntu下插入U盘,显示可读系统。
- JS学习笔记Day8
- <;五>;企业级开源仓库nexus3实战应用–使用nexus3配置npm私有仓库
- Docker:macvlan实现容器跨主机通信 [十四]
- GIT-常规操作
- DirectX11 With Windows SDK--22 立方体映射:静态天空盒的读取与实现
- IIS版本号可以被识别 解决方案