.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) . 仓储用来操作数据库进行数据存取.仓储接口在领域层定义,而仓储的实现类应该写在基础设施层 ...
随机推荐
- min-max容斥/最值反演及其推广
设\(S\)是一个集合,\(\max(S)\)和\(\min(S)\)分别表示集合中的最大值与最小值. 那么有如下式子成立: \[\max(S)=\sum_{T \subseteq S}(-1)^{| ...
- [OI]Noip 2018总结(普及)
考砸了,还有原谅我代码十分有限的可读性. 一个人的真正伟大之处就在于他能够认识到自己的渺小.——保罗 从一年前初一九月到现在18年10月接触OI已经有一年了.几次模拟赛也自我感觉良好,都过了一等的线, ...
- python学习日记(OOP——@property)
在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改: s = Student() s.score = 9999 这显然不合逻辑.为了限制score的 ...
- 20175221 《Java程序设计》第5周学习总结
20175221 <Java程序设计>第5周学习总结 教材学习内容总结 接口的定义 接口声明:interface 接口名 接口体中只可以有常量,而没有变量 接口体中只有抽象方法(可省略 ...
- NodeJS跨域问题
const express = require('express'), app = express(), router = express.Router(), bodyParser = require ...
- Go语言系列(六)- 接口和反射
接口 1. 定义: Interface类型可以定义一组方法,但是这些不需要实现.并且interface不能包含任何变量. type example interface{ Method1(参数列表) 返 ...
- 老男孩Python全栈学习 S9 日常作业 005
1.有如下变量,请实现要求的功能 tu = ("alex", [11, 22, {"k1": 'v1', "k2": ["age& ...
- Tomcat——目录结构
Tomcat目录结构:1. 一级目录 bin ——Tomcat执行脚本目录conf ——Tomcat配置文件lib ——Tomcat运行需要的库文件(JARS)logs ——Tomcat执行时的LOG ...
- LFYZ-OJ ID: 1026 数的计数(数的计算)NOIP2001
数的计算(数的计数) 题目描述 我们要求找出具有下列性质数的个数(包含输入的自然数n).先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理: 不作任何处理; 在它的左边加上 ...
- KL散度
摘自: https://www.jianshu.com/p/43318a3dc715?from=timeline&isappinstalled=0 一.解决的问题 量化两种概率分布P和Q可以使 ...