.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
}
以上为一个示例代码,如果有其他需求自行修改,比如:根据某个属性进行编辑操作等。这里涉及到一个 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有啥关系? 可以见我之前有写的 一个说明 二者关系
完!
.net core2.x - 关于仓储(Repository)的更多相关文章
- C#进阶系列——DDD领域驱动设计初探(二):仓储Repository(上)
前言:上篇介绍了DDD设计Demo里面的聚合划分以及实体和聚合根的设计,这章继续来说说DDD里面最具争议的话题之一的仓储Repository,为什么Repository会有这么大的争议,博主认为主要原 ...
- C#进阶系列——DDD领域驱动设计初探(三):仓储Repository(下)
前言:上篇介绍了下仓储的代码架构示例以及简单分析了仓储了使用优势.本章还是继续来完善下仓储的设计.上章说了,仓储的最主要作用的分离领域层和具体的技术架构,使得领域层更加专注领域逻辑.那么涉及到具体的实 ...
- 仓储Repository
仓储Repository(下) 前言:上篇介绍了下仓储的代码架构示例以及简单分析了仓储了使用优势.本章还是继续来完善下仓储的设计.上章说了,仓储的最主要作用的分离领域层和具体的技术架构,使得领域层更加 ...
- DDD领域驱动设计仓储Repository
DDD领域驱动设计初探(二):仓储Repository(上) 前言:上篇介绍了DDD设计Demo里面的聚合划分以及实体和聚合根的设计,这章继续来说说DDD里面最具争议的话题之一的仓储Repositor ...
- 关于一点儿对仓储(Repository)的理解
仓储(Repository) 内容来源于dudu的 关于Repository模式一文 Repository是一个独立的层,介于领域层与数据映射层(数据访问层)之间.它的存在让领域层感觉不到数据访问层的 ...
- DDD领域驱动设计初探(二):仓储Repository(上)
前言:上篇介绍了DDD设计Demo里面的聚合划分以及实体和聚合根的设计,这章继续来说说DDD里面最具争议的话题之一的仓储Repository,为什么Repository会有这么大的争议,博主认为主要原 ...
- DDD领域驱动设计初探(三):仓储Repository(下)
前言:上篇介绍了下仓储的代码架构示例以及简单分析了仓储了使用优势.本章还是继续来完善下仓储的设计.上章说了,仓储的最主要作用的分离领域层和具体的技术架构,使得领域层更加专注领域逻辑.那么涉及到具体的实 ...
- 仓储repository概念
1.为什么要用仓储?(仓储有什么用) 1.1 解耦 为了解耦领域层与数据映射层的关系. 1.2 管理增删查改 仓储模式最大的优点就是所有的数据访问首先是通过仓库的,对仓库的增删改都不会立即提交到数据库 ...
- ABP学习入门系列(三) (领域层中的仓储Repository)
一,仓储定义:“在领域层和数据映射层的中介,使用类似集合的接口来存取领域对象”(Martin Fowler) . 仓储用来操作数据库进行数据存取.仓储接口在领域层定义,而仓储的实现类应该写在基础设施层 ...
随机推荐
- tornado自定义session
这开始之前我们先了解以下什么是cookie和session 简单的说: cookie是保存在客户端的键值对 session是保存在服务端的键值对 session依赖与cookie 在Django中,可 ...
- Js元素拖拽功能实现
Js元素拖拽功能实现 需要解决的问题 最近项目遇到了一个问题,就是用户某个操作需要弹出一个自定义的内容输入框,但是有个缺点,当浏览太大的时候没办法点击确认和取消按钮,应为这个弹出框是采用绝对定位的,取 ...
- 4.6 并发编程/IO模型
并发编程/IO模型 背景概念 IO模型概念 IO模型分类 阻塞IO (blocking IO) 特点: 两个阶段(等待数据和拷贝数据两个阶段)都被block 设置 server.setsockopt ...
- yyb博客的几道神仙题
该比赛链接 T5 题意: 给你一个\(n\times n\)的网格,开始有\(m\)个被涂成黑色的格子,如果存在三个格子\((x,y)\),\((y,z)\),\((z,x)\)满足\((x,y)\) ...
- BZOJ 4030: [HEOI2015]小L的白日梦
4030: [HEOI2015]小L的白日梦 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 172 Solved: 39[Submit][Statu ...
- 【系统架构】软件核心复杂性应对之道-领域驱动DDD(Domain-Driven Design)
前言 领域驱动设计是一个开放的设计方法体系,目的是对软件所涉及到的领域进行建模,以应对系统规模过大时引起的软件复杂性的问题,本文将介绍领域驱动的相关概念. 一.软件复杂度的根源 1.业务复杂度(软件的 ...
- Ubuntu最常见的包问题
工作环境换成Ubuntu18.04小记:https://www.cnblogs.com/dunitian/p/9773214.html Ubuntu不得不说的就是这个apt出问题的处理 :(换源就不说 ...
- HTML词法和语法
1. 词 token 专业不是计算机的博主比较尴尬,一直以为token就是验证身份用的标识 token —— 表示 “最小有意义的单元” 以这个简单的p标签为例,我们分析哪些是token: <p ...
- Docker: 基础介绍 [一]
一.Docker介绍 Docker是Docker.lnc公司开源的一个基于LXC技术之上构建的Container容器引擎,源代码托管在Github上,基于Go语言并遵从Apache2.0协议开源 Do ...
- GIT-常规操作
本地安装git, 安装文件: Git客户端: 可百度搜索:GIT64位或GIT32位等关键字找到相应的版本进行下载. 本地地址:D:\20-git\Git-2.20.1-64-bit.exe 也可百度 ...