ABP入门系列(3)——领域层定义仓储并实现
一、先来介绍下仓储
仓储(Repository): 仓储用来操作数据库进行数据存取。仓储接口在领域层定义,而仓储的实现类应该写在基础设施层。
在ABP中,仓储类要实现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;
}
示例代码中使用的就是这种方式。
二、如何实现自定义仓储
假设我们需要查找某个用户都分配哪些任务。
- 在领域层,创建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);
}
}
- 在基础架构层,实现该仓储。
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传给父类的构造函数。

三、仓储的注意事项
- 仓储方法中,ABP自动进行数据库连接的开启和关闭。
- 仓储方法被调用时,数据库连接自动开启且启动事务。
- 当仓储方法调用另外一个仓储的方法,它们实际上共享的是同一个数据库连接和事务。
- 仓储对象都是暂时性的,因为IRepository接口默认继承自ITransientDependency接口。所以,仓储对象只有在需要注入的时候,才会由Ioc容器自动创建新实例。
- 默认的泛型仓储能满足我们大部分的需求。只有在不满足的情况下,才创建定制化的仓储。
源码已上传至Github-LearningMpaAbp,可自行参考。
ABP入门系列(3)——领域层定义仓储并实现的更多相关文章
- ABP领域层定义仓储并实现
原文作者:圣杰 原文地址:ABP入门系列(3)——领域层定义仓储并实现 在原文作者上进行改正,适配ABP新版本.内容相同 一.先来介绍下仓储 仓储(Repository): 仓储用来操作数据库进行数据 ...
- ABP入门系列(4)——领域层定义仓储并实现
一.先来介绍下仓储 仓储(Repository): 仓储用来操作数据库进行数据存取.仓储接口在领域层定义,而仓储的实现类应该写在基础设施层. 在ABP中,仓储类要实现IRepository接口,接口定 ...
- ABP入门系列(6)——定义导航菜单
ABP入门系列目录--学习Abp框架之实操演练 完成了增删改查以及页面展示,这一节我们来为任务清单添加[导航菜单]. 在以往的项目中,大家可能会手动在layout页面中添加一个a标签来新增导航菜单,这 ...
- ABP入门教程6 - 领域层创建实体
点这里进入ABP入门教程目录 创建实体 在领域层(即JD.CRS.Core)下新建文件夹Entitys //用以存放实体对象添加一个实体类Course.cs //课程信息 using Abp.Doma ...
- ABP入门系列(1)——学习Abp框架之实操演练
作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...
- ABP入门系列目录——学习Abp框架之实操演练
ABP是"ASP.NET Boilerplate Project (ASP.NET样板项目)"的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WE ...
- ABP入门系列(3)——领域层创建实体
这一节我们主要和领域层打交道.首先我们要对ABP的体系结构以及从模板创建的解决方案进行一一对应.网上有代码生成器去简化我们这一步的任务,但是不建议初学者去使用. 一.首先来看看ABP体系结构 领域层就 ...
- ABP入门系列(2)——领域层创建实体
ABP入门系列目录--学习Abp框架之实操演练 这一节我们主要和领域层打交道.首先我们要对ABP的体系结构以及从模板创建的解决方案进行一一对应.网上有代码生成器去简化我们这一步的任务,但是不建议初学者 ...
- ABP入门系列(18)—— 使用领域服务
ABP入门系列目录--学习Abp框架之实操演练 源码路径:Github-LearningMpaAbp 1.引言 自上次更新有一个多月了,发现越往下写,越不知如何去写.特别是当遇到DDD中一些概念术语的 ...
随机推荐
- ajax 调用 .net core WebAPI,报错 400 (Bad Request) Unexpected character encountered while parsing value
此文由博主前两天的提问及 dudu 的回答整理,地址:https://q.cnblogs.com/list/myquestion 情况说明 基于 .net core 写了一个 Web API,用 po ...
- 解决百度上传WebUploader在IE浏览器下点击无反应的问题
原因1:IE浏览器不支持H5方式上传,需要使用flash的方式上传 解决方法:在页面head标签添加<meta http-equiv="X-UA-Compatible" co ...
- 15 个 Eclipse 常用开发快捷键使用技巧
15 个 Eclipse 常用开发快捷键使用技巧 1.alt+? 或 alt+/:自动补全代码或者提示代码 2.ctrl+o:快速outline视图 3.ctrl+shift+r:打开资源列表 4.c ...
- 指定的 CGI 应用程序遇到错误,服务器终止了该进程。
遇到这种错误只需要把这个项目的Cookies删除再重新启动就行了
- James Munkres Topology: Sec 22 Example 1
Example 1 Let \(X\) be the subspace \([0,1]\cup[2,3]\) of \(\mathbb{R}\), and let \(Y\) be the subsp ...
- 实例分析ASP.NET在MVC5中使用MiniProfiler监控MVC性能的方法
这篇文章主要为大家详细介绍了ASP.NET MVC5使用MiniProfiler监控MVC性能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 MiniProfiler ,一个简单而有效的迷你剖析器 ...
- Gradle 下载的依赖包在什么位置?
Mac系统默认下载到:/Users/(用户名)/.gradle/caches/modules-2/files-2.1Windows系统默认下载到:C:\Users\(用户名)\.gradle\cach ...
- Mysql和mongo安装配置
mysql配置 1.下载镜像 docker pull mysql/mysql-server 2.运行容器 docker run -d -p 3306:3306 --name [Name] [Image ...
- SSM框架搭建后在tomcat部署报错lineNumber: 15; columnNumber: 59; 必须为元素类型 "beans" 声明属性 "xmlns"
删除applicationContext.xml中的文件头上的这个就可以<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" &q ...
- pycharm的list中clear的应用
#清空的意思 li = [11,22,33,44] li.clear() print(li) #输出[],就是把列表清空