一、先来介绍下仓储

仓储(Repository): 仓储用来操作数据库进行数据存取。仓储接口在领域层定义,而仓储的实现类应该写在基础设施层。

在ABP中,仓储类要实现IRepository接口,接口定义了常用的增删改查以及聚合方法,其中包括同步及异步方法。主要包括以下方法:

IRepository接口定义的方法

ABP针对不同的ORM框架对该接口给予了默认的实现;
针对EntityFramework,提供了EfRepositoryBase<TDbContext, TEntity, TPrimaryKey>的泛型版本的实现方式。
针对NHibernate,提供了NhRepositoryBase<TEntity, TPrimaryKey>的泛型版本的实现方式。

泛型版本的实现就意味着,大多数的时候,这些方法已足已应付一般实体的需要。如果这些方法对于实体来说已足够,我们便不需要再去创建这个实体所需的仓储接口/类。

直接通过在应用服务层定义仓储引用,然后通过构造函数注入即可。在我们的应用服务层即可按以下方式使用Task仓储:

public class TaskAppService : ITaskAppService {
private readonly IRepository<Task> _taskRepository;
public TaskAppService(IRepository<Task> taskRepository)
{ _taskRepository = taskRepository;
}

示例代码中使用的就是这种方式。

二、如何实现自定义仓储

假设我们需要查找某个用户都分配哪些任务。

  1. 在领域层,创建IRepositories文件夹,然后定义IBackendTaskRepository。
namespace LearningMpaAbp.IRepositories
{/// <summary>/// 自定义仓储示例/// </summary>public interface IBackendTaskRepository : IRepository<Task>{/// <summary>/// 获取某个用户分配了哪些任务/// </summary>/// <param name="personId">用户Id</param>/// <returns>任务列表</returns>List<Task> GetTaskByAssignedPersonId(long personId);}
}
  1. 在基础架构层,实现该仓储。
namespace LearningMpaAbp.EntityFramework.Repositories
{public class BackendTaskRepository:LearningMpaAbpRepositoryBase<Task>,IBackendTaskRepository{public BackendTaskRepository(IDbContextProvider<LearningMpaAbpDbContext> dbContextProvider) : base(dbContextProvider){}/// <summary>/// 获取某个用户分配了哪些任务/// </summary>/// <param name="personId">用户Id</param>/// <returns>任务列表</returns>public List<Task> GetTaskByAssignedPersonId(long personId){var query = GetAll();if (personId>0){query = query.Where(t => t.AssignedPersonId == personId);}return query.ToList();}}
}

该仓储实现,继承自模板生成的LearningMpaAbpRepositoryBase泛型抽象类,然后再实现IBackendTaskRepository接口。这里要显示声明实现类的有参构造函数,使用泛型的IDbContextProvider将数据库上下文的子类ChargeStationContext传给父类的构造函数。

自定义仓储的代码路径

三、仓储的注意事项

  1. 仓储方法中,ABP自动进行数据库连接的开启和关闭。
  2. 仓储方法被调用时,数据库连接自动开启且启动事务
  3. 当仓储方法调用另外一个仓储的方法,它们实际上共享的是同一个数据库连接和事务。
  4. 仓储对象都是暂时性的,因为IRepository接口默认继承自ITransientDependency接口。所以,仓储对象只有在需要注入的时候,才会由Ioc容器自动创建新实例。
  5. 默认的泛型仓储能满足我们大部分的需求。只有在不满足的情况下,才创建定制化的仓储。

源码已上传至Github-LearningMpaAbp,可自行参考。

作者:圣杰
链接:https://www.jianshu.com/p/6e90a94aeba4
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

ABP入门系列(3)——领域层定义仓储并实现相关推荐

  1. ABP入门系列(6)——定义导航菜单

    ABP入门系列目录--学习Abp框架之实操演练 源码路径:Github-LearningMpaAbp 完成了增删改查以及页面展示,这一节我们来为任务清单添加[导航菜单]. 在以往的项目中,大家可能会手 ...

  2. [置顶]ABP入门系列目录——学习Abp框架之实操演练

    本系列文章主要是基于ABP模板开发Mpa(多页面)『任务清单』项目. 由于是入门系列,不会用到代码生成器,每一行代码都是手动敲入. 源码已上传至Github-LearningMpaAbp,可自行参考. ...

  3. ABP入门系列(2)——领域层创建实体

    这一节我们主要和领域层打交道.首先我们要对ABP的体系结构以及从模板创建的解决方案进行一一对应.网上有代码生成器去简化我们这一步的任务,但是不建议初学者去使用. 一.首先来看看ABP体系结构 ABP体 ...

  4. ABP入门系列(5)——展现层实现增删改查

    ABP入门系列目录--学习Abp框架之实操演练 源码路径:Github-LearningMpaAbp 这一章节将通过完善Controller.View.ViewModel,来实现展现层的增删改查.最终 ...

  5. ABP入门系列(7)——分页实现

    ABP入门系列目录--学习Abp框架之实操演练 完成了任务清单的增删改查,咱们来讲一讲必不可少的的分页功能. 首先很庆幸ABP已经帮我们封装了分页实现,实在是贴心啊. 来来来,这一节咱们就来捋一捋如何 ...

  6. ABP入门系列(4)——创建应用服务

    ABP入门系列目录--学习Abp框架之实操演练 1. 解释下应用服务层 应用服务用于将领域(业务)逻辑暴露给展现层.展现层通过传入DTO(数据传输对象)参数来调用应用服务,而应用服务通过领域对象来执行 ...

  7. ABP入门系列(7)——分页实现_0

    ABP入门系列目录--学习Abp框架之实操演练 完成了任务清单的增删改查,咱们来讲一讲必不可少的的分页功能. 首先很庆幸ABP已经帮我们封装了分页实现,实在是贴心啊. 来来来,这一节咱们就来捋一捋如何 ...

  8. ABP入门系列(14)——应用BootstrapTable表格插件

    1. 引言 之前的文章ABP入门系列(7)--分页实现讲解了如何进行分页展示,但其分页展示仅适用于前台web分页,在后台管理系统中并不适用.后台管理系统中的数据展示一般都是使用一些表格插件来完成的.这 ...

  9. ABP入门系列(8)——Json格式化

    ABP入门系列目录--学习Abp框架之实操演练 源码路径:Github-LearningMpaAbp 讲完了分页功能,这一节我们先不急着实现新的功能.来简要介绍下Abp中Json的用法.为什么要在这一 ...

最新文章

  1. python变量如何声明_如何确定变量是否在Python中声明?
  2. c语言for循环运行格式,关于for循环的格式
  3. Windows内存管理(3)--检查内存可用性,结构化异常处理 和 ASSERT
  4. 连接器与加载器pdf_pdf转换为excel,你不会,同事点点鼠标2分钟就搞定了
  5. linux及windows文件共享
  6. Redis 缓存 + Spring 的集成示例
  7. 健身 赚钱 ; 旅行 用心爱一个人就行了 其他的都会开挂来临~
  8. 常见电脑故障之网络不通
  9. java文件转换pdf模糊_java 库将 pdf 文件转换成高清图片方法
  10. Origin——积分工具
  11. 占据栅格地图构建(Occupancy Grid Map)
  12. VUE+ElementUI+SheetJS解析Excel
  13. linux程序间管道通信,linux进程间通信——管道 详解
  14. 港股2017年表现全球最好,区块链将助推新经济牛市?
  15. 路径/ ./ ../的区别
  16. numpy.corrcoef 计算相关系数
  17. uni-app蓝牙设备连接以及设备的传输,CRC16,ios蓝牙和安卓蓝牙获取数据不一致处理方案
  18. Facebook身份验证如何有效通过
  19. 那个“支付宝锦鲤”女孩,现在变得怎么样了?你肯定想象不到
  20. 1wifi 简介(框架)2系统启动后的 wifi加载 过程-图解 3系统启动后的 wifi 加载过程

热门文章

  1. Mysql密码忘记了怎么办?
  2. 用JavaScript语言判断一个三位数是否为水仙花数
  3. C# ADO.NET
  4. 求一个整数数组的最大元素,递归方法实现
  5. link2001错误无法解析外部符号metaObject
  6. 【转】如何用css限制文字长度,使溢出的内容用省略号…显示
  7. [oracle] 组织架构退格显示 connect by
  8. sql SET DATEFORMAT对日期处理的影响
  9. python爬虫脚本ie=utf-8_Python反爬虫伪装浏览器进行爬虫
  10. ubuntu20.04下安装vmshare tools_Go语言的安装与配置-vscode