您好,欢迎访问一九零五行业门户网

ABP入门系列(4)——领域层定义仓储并实现

仓储(repository): 仓储用来操作数据库进行数据存取。仓储接口在领域层定义,而仓储的实现类应该写在基础设施层。
在abp中,仓储类要实现irepository接口,接口定义了常用的增删改查以及聚合方法,其中包括同步及异步方法。主要包括以下方法:
abp针对不同的orm框架对该接口给予了默认的实现;
针对entityframework,提供了efrepositorybasea29986fee22526a5407caa29d4b24ac5的泛型版本的实现方式。
针对nhibernate,提供了nhrepositorybase4e84b4bc296b49360965cc58466355f8的泛型版本的实现方式。
泛型版本的实现就意味着,大多数的时候,这些方法已足已应付一般实体的需要。如果这些方法对于实体来说已足够,我们便不需要再去创建这个实体所需的仓储接口/类。
直接通过在应用服务层定义仓储引用,然后通过构造函数注入即可。在我们的应用服务层即可按以下方式使用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入门系列目录——学习abp框架之实操演练
以上就是abp入门系列(4)——领域层定义仓储并实现的内容。
其它类似信息

推荐信息