abp(net core)+easyui+efcore仓储系统——定义仓储并实现 (四)
abp(net core)+easyui+efcore仓储系统目录
abp(net core)+easyui+efcore仓储系统——abp总体介绍(一)
abp(net core)+easyui+efcore仓储系统——解决方案介绍(二)
abp(net core)+easyui+efcore仓储系统——领域层创建实体(三)
在上一篇文章中我们创建了module实体并在数据库中生成了数据表,在这一文章中我们介绍如何来对数据库进行操作。
一、先来介绍下仓储
仓储(repository): 仓储用来操作数据库进行数据存取。仓储接口在领域层定义,而仓储的实现类应该写在基础设施层。
在abp中,仓储类要实现irepository接口,接口定义了常用的增删改查以及聚合方法,其中包括同步及异步方法。主要包括以下方法:
abp针对不同的orm框架对这个接口进行了默认的实现:
1) 对于entityframeworkcore,提供了efcorerepositorybase<tdbcontext, tentity, tprimarykey>的泛型版本的实现方式。
2) 对于nhibernate,提供了nhrepositorybase<tentity, tprimarykey>的泛型版本的实现方式。
这些使用泛型的实现类,在大多数的时候,这些实现类中的方法已经足够应付一般增删改查的需要。如果默认实现类中的方法对于实体类来说已够用了,我们便不需要再去创建这个实体所需的仓储接口与实现类。直接通过在应用服务层定义仓储引用,然后通过构造函数注入即可。
接下来,我们来讲讲如何自定义仓储实现类。
二、如何实现自定义仓储
1. 在visual studio 2017的“解决方案资源管理器”中,右键单击在领域层“abp.tplms.core”项目。 选择“添加” > “新建文件夹”。
2.将文件夹命名为“irepositories”。
3. 右键单击“irepositories”文件夹,然后选择“添加” > “类”。 在弹出对话框“添加新项- abp.tplms.core”中选择接口,将接口命名为 imodulerepository。然后使用鼠标左键单击“添加”按钮。如下图。
4. imodulerepository接口的代码如下。
using abp.domain.repositories; using abp.tplms.entitys; using system; using system.collections.generic; using system.text; namespace abp.tplms.irepositories { interface imodulerepository: irepository<module> { /// <summary> /// 分页查询功能模块 /// </summary> /// <param name="pageindex">页索引</param> /// <param name="pagesize">每页多少条</param> /// <returns>模块列表</returns> ienumerable<module> loadmodules(int pageindex, int pagesize); /// <summary> /// 批量删除 /// </summary> /// <param name="ids"></param> /// <returns></returns> bool delete(string ids); } }
三、在基础架构层,实现该仓储。
1. 在visual studio 2017的“解决方案资源管理器”中,打开“abp.tplms.entityframeworkcore”项目,找到“repositories”目录,在这个目录中有一个abp生成的基类。如下图。
2. 鼠标右键单击“repositories”文件夹,然后选择“添加” > “类”。 在弹出对话框“添加新项- abp.tplms.entityframeworkcore”中类命名为 imodulerepository。然后使用鼠标左键单击“添加”按钮。代码如下。
using abp.entityframeworkcore; using abp.tplms.entitys; using abp.tplms.irepositories; using system; using system.collections.generic; using system.linq; using system.linq.expressions; using system.text; namespace abp.tplms.entityframeworkcore.repositories { public class modulerepository:tplmsrepositorybase<module>, imodulerepository { public modulerepository(idbcontextprovider<tplmsdbcontext> dbcontextprovider) : base(dbcontextprovider) { } public bool delete(string ids) { var idlist = ids.split(','); expression<func<module, bool>> exp = m => idlist.contains(m.id.tostring()); bool result = true; delete(exp); return result; } public ienumerable<module> loadmodules(int pageindex, int pagesize) { return context.modules.orderby(u => u.id).skip((pageindex - 1) * pagesize).take(pagesize); } } }
该仓储实现,继承自模板生成的tplmsrepositorybase泛型抽象类,然后再实现imodulerepository接口。这里要显示声明实现类的有参构造函数,使用泛型的idbcontextprovider将数据库上下文的子类chargestationcontext传给父类的构造函数。如下图。
四、仓储的注意事项
- 仓储实现类方法中,abp自动进行数据库连接的开启和关闭。
- 仓储方法被调用时,数据库连接自动开启事务。
- 当仓储方法调用另外一个仓储的方法,它们实际上共享的是同一个数据库连接和事务。
- 仓储对象都是暂时性的,因为irepository接口默认继承自itransientdependency接口。所以,仓储对象只有在需要注入的时候,才会由ioc容器自动创建新实例。
- abp默认的泛型仓储功能满足我们大部分的curd操作需求。当有默认的仓储功能不满足需求的情况下,可以创建自己定制化的仓储实现类。
推荐阅读
-
abp(net core)+easyui+efcore实现仓储管理系统——展现层实现增删改查之列表视图(七)
-
abp(net core)+easyui+efcore实现仓储管理系统——展现层实现增删改查之增删改视图(八)
-
abp(net core)+easyui+efcore实现仓储管理系统——展现层实现增删改查之菜单与测试(九)
-
abp(net core)+easyui+efcore实现仓储管理系统——ABP WebAPI与EasyUI结合增删改查之四(三十)
-
bp(net core)+easyui+efcore实现仓储管理系统——入库管理之三存储过程(三十九)
-
abp(net core)+easyui+efcore实现仓储管理系统——EasyUI之货物管理二 (二十)
-
abp(net core)+easyui+efcore实现仓储管理系统,入库管理
-
abp(net core)+easyui+efcore仓储系统——创建应用服务(五)
-
abp(net core)+easyui+efcore实现仓储管理系统——EasyUI之货物管理一 (十九)
-
abp(net core)+easyui+efcore实现仓储管理系统——入库管理之八(四十四)