概要:在搭建框架,顺手说下写下,关于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)的更多相关文章

  1. C#进阶系列——DDD领域驱动设计初探(二):仓储Repository(上)

    前言:上篇介绍了DDD设计Demo里面的聚合划分以及实体和聚合根的设计,这章继续来说说DDD里面最具争议的话题之一的仓储Repository,为什么Repository会有这么大的争议,博主认为主要原 ...

  2. C#进阶系列——DDD领域驱动设计初探(三):仓储Repository(下)

    前言:上篇介绍了下仓储的代码架构示例以及简单分析了仓储了使用优势.本章还是继续来完善下仓储的设计.上章说了,仓储的最主要作用的分离领域层和具体的技术架构,使得领域层更加专注领域逻辑.那么涉及到具体的实 ...

  3. 仓储Repository

    仓储Repository(下) 前言:上篇介绍了下仓储的代码架构示例以及简单分析了仓储了使用优势.本章还是继续来完善下仓储的设计.上章说了,仓储的最主要作用的分离领域层和具体的技术架构,使得领域层更加 ...

  4. DDD领域驱动设计仓储Repository

    DDD领域驱动设计初探(二):仓储Repository(上) 前言:上篇介绍了DDD设计Demo里面的聚合划分以及实体和聚合根的设计,这章继续来说说DDD里面最具争议的话题之一的仓储Repositor ...

  5. 关于一点儿对仓储(Repository)的理解

    仓储(Repository) 内容来源于dudu的 关于Repository模式一文 Repository是一个独立的层,介于领域层与数据映射层(数据访问层)之间.它的存在让领域层感觉不到数据访问层的 ...

  6. DDD领域驱动设计初探(二):仓储Repository(上)

    前言:上篇介绍了DDD设计Demo里面的聚合划分以及实体和聚合根的设计,这章继续来说说DDD里面最具争议的话题之一的仓储Repository,为什么Repository会有这么大的争议,博主认为主要原 ...

  7. DDD领域驱动设计初探(三):仓储Repository(下)

    前言:上篇介绍了下仓储的代码架构示例以及简单分析了仓储了使用优势.本章还是继续来完善下仓储的设计.上章说了,仓储的最主要作用的分离领域层和具体的技术架构,使得领域层更加专注领域逻辑.那么涉及到具体的实 ...

  8. 仓储repository概念

    1.为什么要用仓储?(仓储有什么用) 1.1 解耦 为了解耦领域层与数据映射层的关系. 1.2 管理增删查改 仓储模式最大的优点就是所有的数据访问首先是通过仓库的,对仓库的增删改都不会立即提交到数据库 ...

  9. ABP学习入门系列(三) (领域层中的仓储Repository)

    一,仓储定义:“在领域层和数据映射层的中介,使用类似集合的接口来存取领域对象”(Martin Fowler) . 仓储用来操作数据库进行数据存取.仓储接口在领域层定义,而仓储的实现类应该写在基础设施层 ...

随机推荐

  1. 常用的flex布局

    演示地址:https://xibushijie.github.io/static/flex.html

  2. 【XSY2903】B 莫比乌斯反演

    题目描述 有一个\(n\times n\)的网格,除了左下角的格子外每个格子的中心里都有一个圆,每个圆的半径为\(R\),问你在左下角的格子的中心能看到多少个圆. \(n\leq {10}^9,R_0 ...

  3. Day040--HTML&CSS

    内容回顾: 标签分类: (1)行内标签 span 小跨度的标签 i em a 特点: (1)在一行内显示 (2)不能设置宽高,如果不设置宽高,默认是内容的宽高 (2)块级标签 h1~h6 h1页面中尽 ...

  4. HTTP和RFC

    RFC: Request For Comments(RFC),是一系列以编号排定的文件.文件收集了有关互联网相关信息,以及UNIX和互联网社区的软件文件.目前RFC文件是由Internet Socie ...

  5. JavaScript null和undefined的区别

    前言 1995年javascript诞生时,最初像Java一样,只设置了null作为表示"无"的值.根据C语言的传统,null被设计成可以自动转为0 但是,javascript的设 ...

  6. 代码,python1

    def main(): try: number1,number2=eval(input("please enter two number")) result=number1/num ...

  7. 有趣的若干个AI项目

    一.遗传算法跑贪吃蛇 1.下载processing,下载地址是:https://processing.org/download ,直接解压打开即可. 2.下载SnakeAI源码,下载地址是:https ...

  8. vue安装scss,并且全局引入

    在写vue的css样式时,觉得需要css预处理器让自己的css更加简洁.适应性更强.可读性更佳,更易于代码的维护,于是在vue-cli脚手架采用scss.写过的人都知道,每写一个.vue文件都要在st ...

  9. What a Ridiculous Election UVALive - 7672 (BFS)

    题目链接: E - What a Ridiculous Election  UVALive - 7672 题目大意: 12345 可以经过若干次操作转换为其它五位数. 操作分三种,分别为: 操作1:交 ...

  10. 《尚学堂_史上最易懂的设计模式视频》--章节5 动态代理-JDK6自带的编译器

    所有的设计模式中最难的一个 ==组合和聚合是有很大区别的 组合和聚合是有很大区别的,这个区别不是在形式上,而是在本质上: 比如A类中包含B类的一个引用b,当A类的一个对象消亡时,b这个引用所指向的对象 ...