ABP入门系列(4)——领域层定义仓储并实现
一、先来介绍下仓储
仓储(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入门系列(4)——领域层定义仓储并实现的更多相关文章
- ABP领域层定义仓储并实现
原文作者:圣杰 原文地址:ABP入门系列(3)——领域层定义仓储并实现 在原文作者上进行改正,适配ABP新版本.内容相同 一.先来介绍下仓储 仓储(Repository): 仓储用来操作数据库进行数据 ...
- ABP入门系列(3)——领域层定义仓储并实现
ABP入门系列目录--学习Abp框架之实操演练 一.先来介绍下仓储 仓储(Repository): 仓储用来操作数据库进行数据存取.仓储接口在领域层定义,而仓储的实现类应该写在基础设施层. 在ABP中 ...
- 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中一些概念术语的 ...
随机推荐
- Objective-C 变量和基本的数据类型
转自:http://blog.csdn.net/mengxiangyue/article/details/11369679 OC中有如下基本数据类型: int:声明整型变量 double:声明双精度变 ...
- Tomcat单向Https验证搭建,亲自实现与主流浏览器、Android/iOS移动客户端安全通信
众所周知,iOS9已经开始在联网方面默认强制使用Https替换原来的Http请求了,虽然Http和Https各有各的优势,但是总得来说,到了现在这个安全的信息时代,开发者已经离不开Https了. 网上 ...
- apache 指定的网络名不再可用 原因及解决方法
1.出现问题状况: 出现问题网站:http://www.ayyzz.cn/ 前段时间作文大全网出现有时候比较慢,有时候“找不到网页”404错误:另外在error.log里也报错: [Mon May 0 ...
- 数据库之Group By用法
sql语句Group By用法 sql语句Group By用法一则 sql语句Group By用法一则 如果我们的需求变成是要算出每一间店 (store_name) 的营业额 (sales),那怎么办 ...
- 关于启动 SecureCRT 遇到一个致命的错误且必须关闭
--------------------------SecureCRT---------------------------SecureCRT 遇到一个致命的错误且必须关闭. 一个崩溃转储文件已创建于 ...
- 兼容ie8 rgba()用法
今天遇到了一个问题,要在一个页面中设置一个半透明的白色div.这个貌似不是难题,只需要给这个div设置如下的属性即可: background: rgba(255,255,255,.1); 但是要兼容到 ...
- tmp
Hello 大家好,这次给大家带来的是Gear VR4代,首先我得感谢下我们的虎友Hide兄弟友情提供Gear给我们测评,感谢 感谢.之前我录的前哨战也说过,这次Gear VR 4代较3代变化并不是很 ...
- mysql的数据转换
在sql语句中完成对数字类型的数据转换成字符类型的数据.像这次将读取出来的float类型的数据,在进行jsonObject.fromObject(object).toString();这个方法,并没有 ...
- Sql Server 常用操作2
FOR XML PATH应用 stuID学生编号,sName代表学生姓名,hobby列存学生的爱好! SELECT B.sName,LEFT(StuList,LEN(StuList)-1) as ho ...
- NSURLSession的基本使用
一.简单说明 在iOS9.0之后,以前使用的NSURLConnection过期,苹果推荐使用NSURLSession来替换NSURLConnection完成网路请求相关操作. NSURLSession ...