博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ABP学习入门系列(三) (领域层中的仓储Repository)
阅读量:4972 次
发布时间:2019-06-12

本文共 2727 字,大约阅读时间需要 9 分钟。

 一,仓储定义:“在领域层和数据映射层的中介,使用类似集合的接口来存取领域对象”

(Martin Fowler) 。

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

public UserAppService(            IRepository
repository, UserManager userManager, IRepository
roleRepository, RoleManager roleManager) : base(repository) { _userManager = userManager; _roleRepository = roleRepository; _roleManager = roleManager; }

  以上为application层的一个service ,在ABP中,仓储类要实现IRepository接口,

大部分情况下这些方法已足已应付一般实体的需要。如果这些方法对于实体来说已足够,我们便不需要再去创建这个实体所需的仓储接口/类。因此我们绝大多数情况下可以想上面的userappservice一样的实现IRepository,来满足数据存取的需求。

二,假设 IRepository没有我们特需的方法。自定义仓储

1,在领域层(core下),创建IRepositories文件夹,然后定义IBackendTaskRepository类。

using Abp.Domain.Repositories;using System.Collections.Generic;using Task = LearningMpaAbp.Tasks.Task;namespace LearningMpaAbp.IRepositories{    ///     /// 自定义仓储示例    ///     public interface IBackendTaskRepository : IRepository
{ ///
/// 获取某个用户分配了哪些任务 /// ///
用户Id ///
任务列表
List
GetTaskByAssignedPersonId(long personId); }}

2,在基础架构层(EntityFramework项目下的EntityFramework下的Repository下添加BackendTaskRepository类),实现该仓储。

using Abp.EntityFramework;using LearningMpaAbp.IRepositories;using System.Collections.Generic;using System.Linq;using Task = LearningMpaAbp.Tasks.Task;namespace LearningMpaAbp.EntityFramework.Repositories{    public class BackendTaskRepository : LearningMpaAbpRepositoryBase
, IBackendTaskRepository { public BackendTaskRepository(IDbContextProvider
dbContextProvider) : base(dbContextProvider) { } ///
/// 获取某个用户分配了哪些任务 /// ///
用户Id ///
任务列表
public List
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容器自动创建新实例。
  • 默认的泛型仓储能满足我们大部分的需求。只有在不满足的情况下,才创建定制化的仓储。
以上。。。 参考:http://www.jianshu.com/p/6e90a94aeba4 代码:https://github.com/tianxiangd/LearnAbp

  

 

转载于:https://www.cnblogs.com/tianjiaxiaobaicai/p/7826794.html

你可能感兴趣的文章
jq工具函数(六)字符串操作函数
查看>>
SSH连接Linux
查看>>
utf-8编码的csv文件 Excel 打开乱码 输出前加 0xEF,0xBB,0xBF 三个char
查看>>
AC日记——配对碱基链 openjudge 1.7 07
查看>>
AC日记——魔方 洛谷 P2007
查看>>
Redis基础认识及常用命令使用(一)--转载
查看>>
刚刚加入程序员的行列,希望通过博客的形式记录自己在这个领域的点点滴滴。同时分享自己的心得体会。...
查看>>
正则替换字符时,同时替换不同的字符
查看>>
nodejs shell
查看>>
区间覆盖
查看>>
查看mysql数据库的所有配置信息和服务器的各种状态
查看>>
加班快乐
查看>>
All-In-One方式-安装openstack
查看>>
shell脚本实现仅保留某目录下最新的两个文件
查看>>
【zabbix 配置邮件告警】
查看>>
C语言bool类型定义
查看>>
导航,头部,CSS基础
查看>>
Vue2.0组织浏览器返回事件
查看>>
DBeauty 2.0.11 发布,数据库关系浏览器
查看>>
Linux Deepin 新增北理工等3处新镜像服务
查看>>