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中一些概念术语的 ...
随机推荐
- shadow Dom(shadowRoot) 访问
示例 gtx.shadowRoot.getElementById("translation") gtx为host对象 起因 抓去chorome谷歌翻译插架的内容.有信息的内容div ...
- jqueryValidation使用
jq form表单前端校验可以使用jq插件jquery-validation.js.具体的使用方法: 1.引入文件: <link rel="stylesheet" href= ...
- My安卓知识4--Media Player called in state 0
//根据被传递的歌曲名称,选择播放的歌曲 public void playByName(String name){ mp = new MediaPlayer(); t ...
- en_windows_10_multiple_editions_version_1511_x64.iso
好久没折腾电脑了,这几天在E盘装了个64位Windows 10 TH2 专业版,从MSDN官网下载的英文原版镜像,用kms10未能激活,一看日志文件,说我这是零售版,后面就关掉了什么监听端口,然后就完 ...
- Centos版Linux 一些常用操作命令
Linux命令收集 1.文件处理命令:ls 功能描述:显示目录文件 命令英文原意:list 命令所在路径:/bin/ls 执行权限:所有用户 语法: ls 选项[-ald] [文件或目录] -a ...
- 前端tip
background简写 参考地址 http://css.doyoe.com/ 缩写:background:url(test1.jpg) no-repeat scroll 10px 20px/50px ...
- C++拷贝构造函数
拷贝构造函数是一种特殊的构造函数,其定义为第一个参数为为本类型的一个引用或者是常引用,且无其它参数或者其它参数为默认值,例如下面的函数: X::X(const X&); X::X(X& ...
- ajax select option 数据。为了下次方便信手拈来!!
为了下次方便信手拈来!! 示例1 var form = document.forms["maddraddform"]; $(form.province).change(functi ...
- MySql之安装配置
1.解压Mysql.zip后,添加bin目录的环境变量 2.配置my.ini文件中的 # basedir =D:\mysql-5.6.24-winx64 # datadir = D:\mysql-5. ...
- Javascript重要知识点梳理
Javascript重要知识点梳理 一.Javascript流程控制 js中常用的数据类型 var关键字的使用 if – else if – else switch while for 二.Javas ...