如何在Asp.Net Core中集成ABP Dapper
在实际的项目中,除了集成abp框架的entityframeworkcore以外,在有些特定的场景下不可避免地会使用一些sql查询语句,一方面是由于现在的entityframeworkcore2.x有些问题没有解决,另外一方面是基于性能方面的考虑,在了解本篇内容之前,首先还是来看看官方文档来给出的说明。
按照官方的介绍整体可以分为下面的步骤:1 安装依赖包。2 添加dependson属性标签。3 entity to table mapping。 4 usage 通过上面的4个步骤我们就能够正常在asp.net core项目中使用abp dapper了,下面我们就具体的过程来做进一步的说明。
一 安装包依赖
这个不做过多的解释,通过nuget 包管理器或者通过程序包管理控制台来添加abp.dapper的引用,在我们实际的项目中整个类库的结构如下图所示,包含dapper和entityframeworkcore两种方案。
二 添加dependson属性标签
后面我们就需要在我们当前类库项目中唯一的salesdatamodule中来做一些初始化和添加dependson标签的操作了。
这里我们应该了解为什么要添加依赖关系?这个我们当前的salesdatamodule会依赖于abpdappermodule和abpzerocoreentityframeworkcoremodule,确立了这样的依赖关系后,在abp框架中就会将当前module所依赖的其它module放到list<abpmodule>的前面,这样通过这样对的层层依赖关系进行拓扑排序就能够保证被依赖的abpmodule一定先进行初始化操作,这样就能够避免引用关系的错误,从而导致代码逻辑的错误,具体说来:如果a 依赖于b,b依赖于c,那么这三个模块之间的排序为c b a,这样在整个module系统初始化的时候,会先执行module c的preintialize()、initialize()、postinitialize()方法,我们看看abp中的源码。
这个里面sortedmodules就是通过这种依赖关系进行拓扑排序的,然后依次这行每个模块中的这几个方法进行一些初始化的操作。
三 entity to table mapping
这个按照官方的解释就是在建立entity和数据库实体之间的关系,这个类似于在domain层实体上面添加【table】标签(个人理解),在这个里面我们还能添加一些其它特性,比如ignore掉一些导航属性等等......
四 应用
这个部分就结合具体的项目来谈一谈一些细节方面的东西,我们先来看看具体的代码。
这段代码主要是通过具体传入的参数计划年、计划周、省份......等参数到数据库中查询相关的记录,这里我们先看看基类dcsdapperrepositorybase<vehicleorderplan>里面做了些什么?
在这个基类中我们继承了abp中的基类dapperefrepositorybase<dcsdbcontext, tentity>,这个泛型基类第一个参数就是我们项目中的具体dbcontext,第二个参数就是我们具体定义的实体,这个实体是主键为int的自增长类型。这里面由于查询的数据非常多,所以我们这里实际上返回的是分页的第一页的结果集,这里还有一个重要的知识就是,为了防止sql注入,这里sql中的参数都采用参数的匿名对象,而不是直接进行拼接,这个是防止sql注入的时候最常见的方式。通过这个具体的例子你应该知道怎样在abp dapper中使用匿名参数对象来防止sql注入,另外通过这段sql你还知道在oracle数据库中如何对查询到的结果进行分页处理。
在处理完这些后,我们再来看看当前vehicleorderplanrepository继承的接口是在哪里进行定义的?具体的领域层又该如何进行调用?
这个接口非常简单,但是这个接口究竟应该在哪里进行定义呢?我们按照ddd思想,首先想到的就是在领域层进行定义,不然领域层其它业务该在哪里调用这个方法呢?那么这个可以从哪里找到答案呢?
有没有对这张图很熟悉,这个就是用于介绍abp n层架构的示意图,红框标注的就是具体的结构中的接口定义和实现,这两者的定义和实现分别是处于不同的层中,一个属于domain layer中而具体的实现位于infrastructure layer中,一层定义接口,而另外一层则定义具体的实现,有了这个你是不是对整个abp的架构有了更深入的理解呢?
以上就是如何在asp.net core中集成abp dapper的详细内容,更多关于asp.net core中集成abp dapper的资料请关注其它相关文章!